次の bash 関数を検討してください。
function quote {
declare quoted=${1//\'/\'\\\'\'}
echo "'$quoted'"
}
この関数は、引数を単一引用符で囲み、既存の各単一引用符を文字列に置き換えます'\''
。
$ quote "a'b"
'a'\''b'
関数本体は 1 行で記述できるようです。
function my_quote {
echo "'${1//\'/\'\\\'\'}'"
}
ただし、これは何らかの理由で機能しません。
$ my_quote "a'b"
'a\'\\'\'b'
そこで、私の質問は (1) 1 行バージョンが機能しないのはなぜですか? (2) バックスラッシュを追加するなどして機能させる方法はありますか?
ところで、興味がある方のために、このスニペットは、そのような関数が役立つ理由を示しています。
foo="some string generated at runtime, possibly containing special characters"
cmd="somecommand $(quote "$foo")"
ssh user@host "$cmd"