如何使用stdin"中的反斜杠读取"变量对于bash osx版本

时间:2017-04-20 18:53:40

标签: bash macos

另一个关于反斜杠在bash命令/脚本中被吃掉的问题,当最终目标是将反斜杠改为正斜杠时。 stackoverflow中有几篇关于此的帖子。大多数建议使用

"read -r"

经过一段时间的游戏,我被困住了。我不确定这是一个osx问题还是bash问题我正在努力。

然而,在我的mac bash中使用以下函数

slashme () 
{ 
  read -r varname;
  echo "$varname";
  echo "$1"; 
  x="$(echo "$1" | sed 's.\\.\/.g')"; 
  echo "$x"; 
}

和以下输入

  

slashme "\\my\\precious"

> \my\precious
> 
> /my/precious

我期望的是:

\\my\\precious

//my//precious

所以,我错过了什么神奇的开关? 我在跑步 GNU Bash 3.2.57(1)-release(x86_64-apple-darwin-15)

3 个答案:

答案 0 :(得分:3)

\\表示双引号字符串中的文字反斜杠。使用单引号:

slashme '\\my\\precious'

答案 1 :(得分:2)

如果你正在使用Bash,你甚至不需要sedBash can do the string replacement by itself

例如:

$ slashme() { 
  x=${1//\\/\/}
  echo "$x"; 
}

$ slashme '\\my\\precious'
//my//precious

关于必须引用字符串以防止反斜杠被特殊处理的观点,立场。

如果您不想添加引号,可以使用read并在运行该函数后输入字符串:

$ slashme() { 
    read -r x
    echo "${x//\\/\/}"
}
$ slashme 
\\my\\precious
//my//precious

答案 2 :(得分:1)

通过解决OP不需要在命令行输入引号的相关愿望来补充现有的,有用的答案

  • 正如ikkachu指出的那样,没有办法正确引用参数,因为 shell在之前解释参数传递到目标命令。

  • 您可以通过定义插入引号的readline宏来使输入更简单的引号,并将光标放在它们之间 - 见下文。

将以下定义添加到~/.inputrc文件中:

# Insert paired quotes and place the cursor between them.
# \e is ESC
# \e[D moves the cursor left
"\e\"": "\"\"\e[D"
"\e'": "''\e[D"   

下次打开shell时,您将能够输入 ESC ' ESC “< / kbd>插入一对单/双引号并将光标放在它们之间。

请注意,您首先 ESC 然后引用字符。

但是,可以将终端应用程序配置为使用 Alt Option )键,这样可以使用同时按下的更快方法宏触发器:

  • Alt +'插入成对的单引号
  • Alt +“以插入成对的双引号

在macOS上,打开Terminal.app的偏好设置,在Profiles标签上选择感兴趣的个人资料,点击Keyboard锚点,然后选择Use Option as Meta key;但请注意,这会禁用通常的系统范围 Option 的macOS键盘快捷键,以生成字符变体。

当然,您可以自由选择自己的按键序列/按键和弦触发器。 请参阅man bashREADLINE部分。