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
これが解決策であるように見える状況では、しばしば必要としないように何かを書き直そうとします。