考虑以下bash函数:
function quote {
declare quoted=${1//\'/\'\\\'\'}
echo "'$quoted'"
}
此函数将参数包装在单引号中,并用字符串'\''
替换每个现有的单引号:
$ quote "a'b"
'a'\''b'
似乎函数体可以写成一行:
function my_quote {
echo "'${1//\'/\'\\\'\'}'"
}
然而,由于某种原因,这不起作用:
$ my_quote "a'b"
'a\'\\'\'b'
所以,我的问题是(1)为什么单行版本不起作用?(2)是否有某种方法可以使其工作,比如添加更多的反斜杠?
顺便说一句,如果你有点好奇,这个片段就说明了为什么这样的功能很有用:
foo="some string generated at runtime, possibly containing special characters"
cmd="somecommand $(quote "$foo")"
ssh user@host "$cmd"
答案 0 :(得分:1)
(1)bash可能不同地处理""
内的参数扩展而不是赋值中的参数扩展。我认为这实际上是一个错误,因为引用的字符串没有被正确引用。如果你在其中使用其他变量,它会以某种方式正常工作。
"${var//x/$other}"
(2)这不是单行方式,只是另一种方式。您可以将变量放在其他位置,但在我看来它仍然不是一行。
function my_quote {
local r="'\''"
echo "'${1//\'/$r}'"
}
您也可以在子shell echo
下放置一个$()
,但这仍然是两行或两个命令。