另一个关于反斜杠在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)
答案 0 :(得分:3)
\\
表示双引号字符串中的文字反斜杠。使用单引号:
slashme '\\my\\precious'
答案 1 :(得分:2)
如果你正在使用Bash,你甚至不需要sed
,Bash 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 )键,这样可以使用同时按下的更快方法宏触发器:
在macOS上,打开Terminal.app
的偏好设置,在Profiles
标签上选择感兴趣的个人资料,点击Keyboard
锚点,然后选择Use Option as Meta key
;但请注意,这会禁用通常的系统范围 Option 的macOS键盘快捷键,以生成字符变体。
当然,您可以自由选择自己的按键序列/按键和弦触发器。
请参阅man bash
,READLINE
部分。