私はいつもシェルのパラメータ拡張に関する奇妙な規則について疑問に思いました。
宣言したら
NUMBERS=" one two "
次のコマンドを実行すると(変数文字列と定数文字列の間にスペースを含めないでください。)
echo ${NUMBERS}'and three'
Bash(およびDashとKornshell)は次のように応答します。
one two and three
ただし、同じ出力がエコーされます。
echo ${NUMBERS} 'and three'
私の印象によると、2.6.5 フィールド分割規則3a、変数を拡張するとき、入力の始まりと終わりのIFSスペースは無視する必要がありますNUMBERS
。
シェルが拡張文字列と定数文字列の間にスペースを入れる場合もあり、そうでない場合もあるのはなぜですか?
答え1
フィールド分割が発生します。後ろに拡張し、IFS
先行および末尾のスペースを無視します。みんな入力(最初の「論理」フィールドの前または最後のフィールドの後にフィールドが生成されないようにするため)、したがってフィールド分割を実行するときの最初の例は次のとおりです。
echo one two 'and three'
これはフィールドとして解析され、one
同様に2番目の例は次のとおりですtwo
。and three
echo one two 'and three'
また、フィールドととして解析されますone
。two
and three