ダッシュ:zshでパラメータala "$ {(q + @)@}"を引用する方法は?

ダッシュ:zshでパラメータala "$ {(q + @)@}"を引用する方法は?

パラメータをダッシュ​​(またはshまたは可能でない場合はbash)として引用したいと思います。"${(q+@)@}"端末に入力したのと同じzshを使用してこれを実行できますreval <sth> ...<sth> ...

reval () {
    eval "$(gquote "$@")"
}
gquote () {
    print -r -- "${(q+@)@}"
}

答え1

for arg do
        arg=$(printf '%s\n' "$arg" | sed "s/'/'\\\''/g")
        set -- "$@" "'$arg'"
        shift
done

eval "$@"

これにより、各位置パラメータの周囲に単一引用符が追加されます。ループは各位置引数を繰り返し、一重引用符を使用してリストの末尾に現在の位置引数を追加し、最初の(現在処理されている)要素を削除します。

埋め込まれた一重引用符は、リストの末尾に追加される'$arg'前に文字列に置き換えられます$arg'\''sed

次の関数でreval

reval () {
    for arg do
            arg=$(printf '%s\n' "$arg" | sed "s/'/'\\\''/g")
            set -- "$@" "'$arg'"
            shift
    done
    
    eval "$@"
}

(したがって、引数は末尾の改行を削除します。)

シェルでは、ループのbashコマンド置換を呼び出してprintf次に置き換えることができます。sed

arg=${arg//\'/\'\\\'\'}

利点は、末尾の改行が保存されることです。bashシェルでもできますが、

reval () {
    eval "${@@Q}"
}

...ここで、${variable@Q}値は$variableシェル入力に合うように引用されています。variablebeingの場合、@これはすべての位置パラメータに適用されます。

${(q)@}これはシェルから得られるものと似ていますzsh

reval () {
    eval "${(q)@}"
}

関連情報