Bashの引用符とスペースを含む変数

Bashの引用符とスペースを含む変数

Bashスクリプトで以下を試しています。

MV_PARAMS='"foo 1" "foo 2"'
mv $MV_PARAMS

私が実際にやりたいことは次のとおりです。

mv "foo 1" "foo 2"

しかし、これはうまくいかないようです。この試み:

mv "$MV_PARAMS"

いいえ。

答え1

あなたがしなければならないことは配列を使用することです:

mv_params=("foo 1" "foo 2")
mv "${mv_params[@]}"

配列拡張は、スペースまたは特殊文字を含む配列要素を正しく処理します。

答え2

シェルスクリプトでファイル名のスペースを処理するのは複雑なことがよくあります。この場合、以下が与えられます。

MV_PARAMS='"foo 1" "foo 2"'

あなたが書くとき:

mv $MV_PARAMS

最終シェルはmv次のように実行されます。

execve("/usr/bin/mv", ["mv", "\"foo", "1\"", "\"foo", "2\""])

つまり、4つのパラメータがあります。

  • 「金持ち
  • 1"
  • 「金持ち
  • 2インチ

eval以下を使用して、シェルに生成されたコマンドラインを解析することができます。

eval "mv $MV_PARAMS"

これはあなたが望むことをするでしょう。時には使いevalにくいことがあり、evalこれが解決策であるように見える状況では、しばしば必要としないように何かを書き直そうとします。

関連情報