私がこのようなことをした場合:
IFS=,
x=hello,hi,world
echo $x
次に、3つの引数(hello
およびhi
とworld
)が抽出され、これらの3つの引数がに渡されecho
ます。
しかし、変数を使用しない場合:
IFS=,
echo hello,hi,world bye
そして、単語の分割は、スペース区切りではなく、カンマ区切り文字を使用して起こるのだろう、とに生成され、渡された2つの引数は、ようecho
になりますhello,hi,world
とbye
。
変数を使用しないときに、スペース以外の区切り文字を使用して単語分割を機能させる方法はありますか?
いいえ、単語の分割は展開後にのみ発生し、コマンドラインで直接指定されたもの(つまり、最新のシェル)では発生しません。POSIXのテキストには次のように書かれています。
2.6.5フィールド分割
パラメーター展開(パラメーター展開)、コマンド置換(コマンド置換)、および算術展開(算術展開)の後、シェルは、フィールド分割との二重引用符で発生しなかった展開と置換の結果をスキャンする必要があります。複数のフィールドが生じる可能性があります。
(私の強調)
そしてBash:
シェルは、単語分割のために二重引用符内で発生しなかったパラメーター展開、コマンド置換、および算術展開の結果をスキャンします。
文字列がスクリプトに直接含まれている場合は、カンマをスペースに置き換えるだけでよいため、これが大きな問題かどうかはわかりません。そして、それが外部からのものである場合、分割は通常、コマンド置換で、またはread
などを使用するときに自然に発生します。
元のBourneシェルでは、動作が少し異なりました。@StéphaneChazelasは、しばらく前に別の質問への回答でこれについて説明しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加