IFS
環境変数を改行文字に設定する次の例の場合...
IFS=$'\n'
IFS
環境変数と\n
文字が何であるか(改行)は知っていますが、次の形式を使用しないでください:IFS="\n"
(これは機能しません)?
たとえば、ファイルのすべての行をループし、forループを使用する場合、これを実行できます。
for line in (< /path/to/file); do
echo "Line: $line"
done
ただし、IFS
が改行文字に設定されていない限り、これは正しく機能しません。動作させるには、これを行う必要があります。
OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS
注:同じことをするための別の方法は必要ありません。他の多くのことは既に知っています...私はその$'\n'
に興味があるだけで、誰かが私にそれに関する説明。
通常、bash
は文字列リテラルのエスケープシーケンスを解釈しません。したがって、\n
または"\n"
または'\n'
と書くと、それは改行ではありません-n
(最初の場合)またはバックスラッシュとそれに続くn
(他の2つの場合)。
$'somestring'
はエスケープシーケンスを含む文字列リテラルの構文です。したがって、'\n'
とは異なり、$'\n'
は実際には改行です。
http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html から:
「$ 'STRING'」という形式の単語は、特別な方法で処理されます。 Wordは文字列に展開され、バックスラッシュでエスケープされた文字がANSI-C標準で指定されたとおりに置き換えられます。バックスラッシュエスケープシーケンスは、Bashのドキュメントにあります。
改行を適切なANSI-C標準にエスケープすることをスクリプトに強制していると思います。
デフォルトのIFSを再回復する-このOLDIFS=$IFS
は必要ありません。デフォルトのIFSを上書きしないように、サブシェルで新しいIFSを実行します。
ar=(123 321); ( IFS=$'\n'; echo ${ar[*]} )
それに、古いIFSを完全に回復できるとは本当に信じていません。 OLDIFS="$IFS"
などの改行を避けるために、二重引用符で囲む必要があります。
ANSI C引用符で囲まれた文字列は重要なポイントです。 @ mklement0に感謝します。
コマンドodを使用して、ANSI Cで引用された文字列をテストできます。
echo -n $'\n' | od -c
echo -n '\n' | od -c
echo -n $"\n" | od -c
echo -n "\n" | od -c
出力:
0000000 \n
0000001
0000000 \ n
0000002
0000000 \ n
0000002
0000000 \ n
0000002
出力によって意味を明確に知ることができます。