シェルスクリプトが与えられるとtest.sh
for var in "$@"
do
echo "$var"
done
そして電話してくださいsh test.sh $(echo '"hello " "hi and bye"')
出力を期待した
hello
hi and bye
しかし、以下を得る:
"hello
"
"hi
and
bye"
私が次に変更した場合sh test.sh $(echo "hello " "hi and bye")
それから私は得ます
hello
hi
and
bye
これらの動作のどれも望ましくない。目的の動作を取得するにはどうすればよいですか?
私が理解したいのはなぜ同じではありませんかsh test.sh $(echo "hello " "hi and bye")
?sh test.sh "hello " "hi and bye"
ベストアンサー1
コマンド置換は文字列を生成します。
の場合
$(echo '"hello " "hi and bye"')
文字列は"hello " "hi and bye"
。
その後、文字列がトークン化されます(ファイル名のグロービングも同様ですが、この例には影響しません)。トークン化は、文字の1つと同じすべての文字$IFS
(デフォルトでは空白、タブ、および改行)で発生します。
デフォルト値は、、、、および単語IFS
を"hello
生成"
します。 "hi
and
bye"
その後、スクリプトに別々のパラメーターとして提供します。
2番目のコマンドでは、コマンドの置き換えは次のようになります。
$(echo "hello " "hi and bye")
その後、文字列が生成され、トークン化は、、、およびhello hi and bye
4つの単語を生成します。hello
hi
and
bye
最後の例では二つパラメータを使用hello
し、hi and bye
スクリプトと共に直接使用されます。これらに慣れる単語の分割は引用されているために発生します。