変数の拡張は、変数のあるコンテキストによって異なる動作をしますか?

変数の拡張は、変数のあるコンテキストによって異なる動作をしますか?

私が次のことをしているとしましょう。

IFS=,
x="hello,hi,world"
y=$x

y文字列があるため、次のように置き換えられますhello hi worldy=$x

y="hello hi world"

それでは、次のスクリプトがあるとしましょう。

IFS=,
x="hello,hi,world"
if [ $x = "hello hi world" ]
then
    echo "equal"
fi

上記のスクリプトを実行すると、次のエラーが発生します。

test.sh: line 3: [: too many arguments

私はステートメントが実行されたときに置き換えられるのではなく置き換えられるので、if [ $x = "hello hi world" ]このエラーが発生すると仮定します。if [ hello hi world = "hello hi world" ]if [ "hello hi world" = "hello hi world" ]

これは、変数が$xそのコンテキストに応じて2つの異なる方法(二重引用符がある場合と二重引用符がない場合)に拡張されることを意味します。

私は正しいですか?

ベストアンサー1

yひもがあるでしょう。hello hi world

いいえ、できません。変数割り当ての拡張は、単語分割やファイル名のグロービングの影響を受けません。 (ある意味、常に二重引用符で囲まれているように動作します。)以下を参照してください。いつ二重引用符が必要ですか?

$ IFS=,
$ x="hello,hi,world"; y=$x
$ echo "$y"
hello,hi,world

if [ $x = "hello hi world" ]ステートメントが次に置き換えられたため、このエラーが発生したとします。if [ hello hi world = "hello hi world" ]

はい、そうです。テキストベースの置換ではありませんが、ここで参照されていないため、トークン化され、$xコマンドは予想される4つの代わりに6つの[異なる引数(hello、、、、、および)を確認します。hiworld=hello hi world]

おすすめ記事