シェルコマンド置換の予期しない動作

シェルコマンド置換の予期しない動作

シェルスクリプトが与えられると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生成"します。 "hiandbye"

その後、スクリプトに別々のパラメーターとして提供します。

2番目のコマンドでは、コマンドの置き換えは次のようになります。

$(echo "hello " "hi and bye")

その後、文字列が生成され、トークン化は、、、およびhello hi and bye4つの単語を生成します。hellohiandbye

最後の例では二つパラメータを使用helloし、hi and byeスクリプトと共に直接使用されます。これらに慣れる単語の分割は引用されているために発生します。

おすすめ記事