IFSのデフォルト値について

IFSのデフォルト値について

私のGNU bashバージョン4.2.8では、IFSにはスペース、タブ、および改行のデフォルト値があります。

usr@T42 ~ $ echo -n "$IFS" | hexdump -C
00000000  20 09 0a                                          | ..|
00000003
usr@T42 ~ $ 

この基本IFSの理由はありますか?また、bashに組み込まれているユーティリティに加えて、IFSを使用する他のユーティリティは何ですかread

ベストアンサー1

IFS変数は、シェルが次のタスクを実行するたびに使用されます。噴射。最も一般的なケースは、$varコマンドのパラメータ拡張(たとえば)またはコマンドの置き換え(たとえば、廃止予定のバックティック)の後です。$(some-command)ここで拡張にIFS文字が含まれている場合は、コマンドを処理する前に別の「単語」に分割されます。実際には、これらの文字は置換されたテキストを別の引数(変数が最初に指定された場合はコマンド名を含む)に分割されることを意味します。

したがって、デフォルトが空白、タブ、および改行である理由は、これがIFS一般に単語を分割することが期待される空白文字であるためです。

単語の区切りが発生しないようにする1つの方法は、拡張子("$var")の周囲に二重引用符を使用することです。実際には質問ですでにこれを行いました。そうしないと、echoパラメータがなく、文字分割パラメータのみがあるため、出力はありません。

また、噴射の2つの場所に注意してくださいいいえパラメータの拡張と変数の割り当て(たとえば、OK)の後に発生し、var=$othervar構文var=$(somecommand)内で[[ ]]発生する可能性がありますが[[ $var = $othervar ]]引用[ $var = $othervar ]符でなければなりません。

最後に、ある賢者が私に指摘したように、一般的な誤解は単語の分割を防ぐことが最も重要であるということです。ただ変数が参照される理由です。そうではありません。引用符もブロックされます。パス名拡張またはグローバル拡張もっと知られたからです。変数にこのようなグローバル文字が含まれている場合は、*コマンドで引用符なしで変数を使用すると、これらの文字をファイル名に拡張できます。たとえば、次のことを考えてみましょう。

var=*
echo $var

これにより、現在のディレクトリにあるファイル名が表示されます。

〜のようにスティーブンは以下で指摘しています。、拡張時に文字の順序がIFS重要です"$*"bashマニュアルページから:

"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable.  If IFS is unset, the parameters are separated by spaces.  If
IFS is null, the parameters are joined without intervening separators.

単語分割の詳細な例については、この回答をご覧ください。https://unix.stackexchange.com/a/118444/48083

おすすめ記事