Bash シェルスクリプトは次の行で始まります。
IFS=$'\n'
このシンボルセットの後に隠された意味は何ですか?
ベストアンサー1
IFS
「内部フィールド区切り記号」を示します。シェルはそれを使用して単語分割を実行する方法、つまり単語境界を認識する方法を決定します。
bashのようなシェルでこれを試してみてください(zshなどの他のシェルではこれを異なる方法で処理できます)。
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
デフォルトはIFS
空白文字(正確には空白、タブ、および改行)で構成されています。各文字は単語の境界にすることができます。したがって、デフォルト値を使用して、上のIFS
ループは次のものを印刷します。
Word: foo:bar
Word: baz
Word: rab
つまり、シェルはスペースを単語の境界と見なします。
それではIFS=:
、ループを実行する前に設定してみてください。この結果は次のとおりです。
Word: foo
Word: bar baz rab
これでシェルmystring
も単語に分割されますが、今ではコロンだけが単語の境界として扱われます。
の最初の文字は特別です。特殊変数を使用すると、出力から単語を区切るIFS
ために使用されます(例:$*
高度なバッシュスクリプトガイド、これらの特殊変数に関する詳細情報を見つけることもできます):
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
比較:
$ bash -c 'set w x y z; IFS="-:;"; echo "$*"'
w-x-y-z
どちらの例でも、シェルはまだすべての文字:
と単語の境界を-
処理します。;
変化する唯一のことは行動です$*
。
知っておくべきもう一つの重要な点は、いわゆる「IFSブランク」がどのように実装されるかです。治療を受ける。デフォルトでは、空白文字が含まれている場合、文字列が処理される前に分割される文字列IFS
から前後の空白が削除され、注文する連続した空白文字もフィールドを区別します。ただし、これは実際に存在する空白文字に対してのみ機能しますIFS
。
"a:b:: c d "
たとえば、文字列(末尾のスペースとスペースの間に2つのスペース文字)を見てみましょう。c
d
- これは、、(空の文字列)と(再び、および間に2つのスペース)
IFS=:
の4つのフィールドに分割されます。最後のフィールドの先頭と末尾のスペースを書き留めます。"a"
"b"
""
" c d "
c
d
- を使用すると、、、(空の文字列)と
IFS=' :'
の5つのフィールドに分けられます。どこにも先行および末尾のスペースはありません。"a"
"b"
""
"c"
"d"
2番目の例では、複数の連続した空白文字は2つのフィールドを区別しますが、複数の連続したコロンは空白文字ではないため区切りません。
に関しては、これは、FreeBSD(すべてのシェル間で変更される)でもサポートされる構文IFS=$'\n'
です。ksh93
Bashのマニュアルページを引用すると、次のようになります。bash
zsh
mksh
sh
$ 'string'形式の単語は特別に扱われます。単語は、ANSI C規格で指定されているように置き換えられたバックスラッシュエスケープ文字を使用して「文字列」に拡張されます。
\n
改行文字のエスケープシーケンスなので、IFS
最終的には単一の改行文字に設定されます。