あるbashスクリプトから別のbashスクリプトに二重引用符を含むパラメータを渡す

あるbashスクリプトから別のbashスクリプトに二重引用符を含むパラメータを渡す

Bashスクリプトは次のように呼び出されます。

$./script 25 "str1 str2"

上記とまったく同じ(引用符を含む)2つの引数を受け取る別のスクリプトを実行する端末を起動する必要があります。私はこれを試しました:

lxterminal --command=$"./script2 "$"$@"

しかし、これは引用符を省略したように見えるので、呼び出しは元の./script2 25 str1 str2コマンドラインから引数をコピーする正しい表記法は何ですか?

答え1

lxterminal問題は、sの引数が単なる--command文字列であるため、他の端末のようにコマンドとその引数を受け入れることができないことですxterm

lxterminal独自のルールを使用して文字列を解析して、その引数を実行するコマンドを決定します。これは Bourne シェルの構文解析と似ていますが、同じではありません。

パラメータ区切り記号は二重引用符とスペースを認識するので、'...'次のように引用符を実装できます。

lxquote() {
  awk -v q="'" '
    function lxquote(s) {
      gsub(q, q "\\" q q, s)
      return q s q
    }
    BEGIN {
      for (i = 1; i < ARGC; i++) {
        printf sep "%s", lxquote(ARGV[i])
        sep = " "
      }
    }' "$@"
}

次のように呼び出されますlxterminal

lxterminal --command="$(lxquote ./script2 "$@")"

または、scriptインタプリタがある場合は、bash次のことができます。

printf -v code '%q ' ./script2 "$@"
CODE=$code lxterminal --command="bash -c 'eval \"\$CODE\"'"

関連情報