皆様、IFS 変数に空白の値が表示されるのはなぜかご存じでしょうか。
bash-4.2$ set | grep -i ifs
IFS=$' \t\n'
bash-4.2$ echo $IFS
bash-4.2$
bash-4.2$
答え1
空白の値が表示されるのは、それがは常にIFSに保存されます: スペース (非表示)、タブ (非表示)、改行 (非表示) が含まれます。
ドル記号もバックスラッシュも文字も含まれていません。これは単に、set
非表示の文字を含む変数を表示しようとする方法です。つまり、 は\t
タブを表し、 は\n
改行を表し、その周囲は$'...'
バックスラッシュの組み合わせがリテラル テキストではなく特殊文字として解釈されることを示します。
set
この特定の形式を使用するのは、戻るシェルに他のコマンドの一部として追加します。たとえば、runはecho $'Hello\tworld!
タブを出力します\t
。そして実際にはランニング IFS=$' \t\n'
コマンドとして、IFS 変数は実際にスペース + タブ + 改行に設定されます。
答え2
と\t
は\n
入力時に解析され、実際の文字コードに変換されるためです。そのため、 の出力はecho $IFS
スペースのように見えます (引用符を付けていないため、引数の解析によって一部が削除されます)。実際の内容を確認したい場合は、16 進数に変換し、文字が解析されないように引用符で囲むことを忘れないでください。
IFS=$' \t\n'
printf '%s' "$IFS" | hd
00000000 20 09 0a | ..|
00000003
0