web-dev-qa-db-ja.com

IFS = $ '\ n'の正確な意味は何ですか?

IFS環境変数を改行文字に設定する次の例の場合...

IFS=$'\n'
  • ドル記号はどういう意味ですか?正確に
  • この特定のケースでは何をしますか?
  • この特定の使用法に関する詳細はどこで参照できますか(Googleは検索に特殊文字を使用できません。

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'に興味があるだけで、誰かが私にそれに関する説明。

115
Yanick Girouard

通常、bashは文字列リテラルのエスケープシーケンスを解釈しません。したがって、\nまたは"\n"または'\n'と書くと、それは改行ではありません-n(最初の場合)またはバックスラッシュとそれに続くn(他の2つの場合)。

$'somestring'エスケープシーケンスを含む文字列リテラルの構文です。したがって、'\n'とは異なり、$'\n'は実際には改行です。

155
sepp2k

http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html から:

「$ 'STRING'」という形式の単語は、特別な方法で処理されます。 Wordは文字列に展開され、バックスラッシュでエスケープされた文字がANSI-C標準で指定されたとおりに置き換えられます。バックスラッシュエスケープシーケンスは、Bashのドキュメントにあります。

改行を適切なANSI-C標準にエスケープすることをスクリプトに強制していると思います。

16
Brad Swerdfeger

デフォルトのIFSを再回復する-このOLDIFS=$IFSは必要ありません。デフォルトのIFSを上書きしないように、サブシェルで新しいIFSを実行します。

ar=(123 321); ( IFS=$'\n'; echo ${ar[*]} )

それに、古いIFSを完全に回復できるとは本当に信じていません。 OLDIFS="$IFS"などの改行を避けるために、二重引用符で囲む必要があります。

8
Marek

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

出力によって意味を明確に知ることができます。

3
Big Shield