2

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

1 回答 1

1

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

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

(2) 这不是一条线的方式,只是另一种方式。您可以将变量放在其他地方,但在我看来它仍然不是一条线。

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

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

于 2013-09-11T07:01:04.673 回答