1. ホーム
  2. bash

[解決済み] IFS=$' \n' の正確な意味は何ですか?

2022-07-11 01:43:28

質問

以下の例で 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' と誰かが私にそれについての説明を与えることができるかどうか疑問に思いました。

どのように解決するのですか?

通常は bash は文字列リテラル内のエスケープシーケンスを解釈しません。ですから、もしあなたが \n と書くか "\n" または '\n' という文字がありますが、これは改行ではありません。 n (最初の場合) またはバックスラッシュの後に文字 n (という文字が続きます(他の2つの場合)。

$'somestring' の構文で、文字列リテラルにエスケープシーケンス . そのため '\n' , $'\n' は実際には改行です。