二重引用符を追加しながら、bashで文字列を連結します。

二重引用符を追加しながら、bashで文字列を連結します。

次のbashスクリプトがあります。

set -ex
X="bash -c"
Y="ls -al"

実行したい(二重引用符に注意)。

bash -c "ls -al"

以下は機能しません:

C=$X\ $Y
$C

これは出力を提供します

+ X='bash -c'
+ Y='ls -al'
+ C='bash -c ls -al'
+ bash -c ls -al

ls -alの周りに二重引用符がありません。

私はこれを試しました:

C=$X\ \"$Y\"

しかし、これはうまくいきません。

+ X='bash -c'
+ Y='ls -al'
+ C='bash -c "ls -al"'
+ bash -c '"ls' '-al"'

Yの周りに二重引用符を保持しながら、YをXに正しく接続する方法は?

答え1

配列変数を使用できますC

X="bash -c"
Y="ls -al"
C=($X "$Y")
"${C[@]}"

$X1つのコマンドと1つのパラメータしかないため、引用符はありません。

または短いバージョン:

C=(bash -c "ls -al")
"${C[@]}"

答え2

どちらの方法も効果があり、より多くの方法があると確信しています。

X="bash -c"
Y="ls -al"

Z="$X \"$Y\""
echo $Z

Z=$(printf '%s "%s"' "$X" "$Y")
echo $Z

関連情報