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>