单行引用bash中的字符串

时间:2013-09-11 04:33:04

标签: bash shell quoting

考虑以下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"

1 个答案:

答案 0 :(得分:1)

(1)bash可能不同地处理""内的参数扩展而不是赋值中的参数扩展。我认为这实际上是一个错误,因为引用的字符串没有被正确引用。如果你在其中使用其他变量,它会以某种方式正常工作。

"${var//x/$other}"

(2)这不是单行方式,只是另一种方式。您可以将变量放在其他位置,但在我看来它仍然不是一行。

function my_quote {
    local r="'\''"
    echo "'${1//\'/$r}'"
}

您也可以在子shell echo下放置一个$(),但这仍然是两行或两个命令。