2

次の 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"
4

1 に答える 1

1

(1) おそらく、bash""が割り当て内のパラメーター展開とは異なる方法でパラメーター展開を処理する方法です。引用符で囲まれた文字列が適切に引用符で囲まれていないため、実際にはバグだと思います。内部で他の変数を使用すると、どういうわけか正しく機能します

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

(2) これは 1 行の方法ではなく、別の方法です。変数を他の場所に配置することもできますが、私の意見ではまだ 1 行ではありません。

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

echoサブシェルの下に を配置することもできますが$()、それでも 2 行または 2 つのコマンドを 1 つにまとめることになります。

于 2013-09-11T07:01:04.673 に答える