Bashは、「IFS」変数の値に応じて動作を変更します。

Bashは、「IFS」変数の値に応じて動作を変更します。

IFS変数をスペースに設定すると、複数のbashスペースが1つのスペースとして扱われます(myprogram受け取るコマンドライン引数を印刷するプログラムです)。

IFS=" "
x="hello   hi   world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world

IFSただし、変数をコンマに設定すると、複数のbashコンマが1つとして扱われません。

IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] = 
argv[3] = 
argv[4] = hi
argv[5] = 
argv[6] = 
argv[7] = world

なぜそんなことですか?

ベストアンサー1

これはman bash.IFSに書き込まれます。空白以外の文字がある場合、フィールドは区切ります。

からman bash

シェルは IFS の各文字を区切り文字として扱い、これらの文字をフィールド終端として使用して、他の拡張結果を単語に分割します。 IFSが設定されていない場合、またはその値がデフォルト値<space><tab><newline>の場合、前の拡張結果の始まりと終わりにある、およびシーケンスは無視され、<space>始まり <tab>または終わりにないIFS文字シーケンスは区切るために使用されます。<newline>言葉。 IFS値がデフォルト値ではない場合、スペース文字がIFSスペース文字(IFSスペース文字)値にある限り、単語の先頭と末尾にある一連のスペース、タブ、および改行は無視されます。 IFS スペースではなく、IFS のすべての文字と隣接する IFS スペース文字が一緒にフィールドを区別します。空白文字の IFS シーケンスも区切り文字と見なされます。 IFS値が空の場合、単語分割は発生しません。 [強調する。 ]

例: フィールド分割

IFS にスペース文字がない場合、フィールドにスペースが含まれます。

$ ( IFS=',' x='one , two,three'; printf "<%s>\n" $x )
<one >
< two>
<three>

IFSにスペースとカンマの両方が含まれている場合、スペース、カンマ、およびスペースの順序は単一の区切り文字として扱われます。

$ ( IFS=' ,' x='one , two,three'; printf "<%s>\n" $x )
<one>
<two>
<three>

カンマシーケンスは空のフィールドシーケンスとして解釈されます。

$ ( IFS=' ,' x='one,,,two,three'; printf "<%s>\n" $x )
<one>
<>
<>
<two>
<three>

例:先行および末尾のスペース

IFS にスペースがない場合は、すべての先行スペースと末尾のスペースがフィールドに保持されます。

$ ( IFS=',' x='  one , two,three  ,'; printf "<%s>\n" $x )
<  one >
< two>
<three  >

IFSにスペースが含まれている場合、前または後続のスペースシーケンスが削除されます。

$ ( IFS=' ,' x='  one , two,three  ,'; printf "<%s>\n" $x )
<one>
<two>
<three>

おすすめ記事