130

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'あり、誰かが説明してくれるかどうか疑問に思いました。

4

7 に答える 7

168

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

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

于 2010-11-08T21:36:31.873 に答える
24

この構造体に正式な名前を付けると、形式の文字列はANSI C 引用符付き文字列$'...'と呼ばれます。

つまり、[ANSI] C 文字列の場合と同様に、バックラッシュ エスケープ シーケンスが認識され、文字どおりの対応するものに展開されます (サポートされているエスケープ シーケンスの完全なリストについては、以下を参照してください)。

この展開の、文字列は文字列$'...'と同じように動作します。つまり、 '...'[それ以上の] シェル展開の影響を受けないリテラルとして扱われ。

たとえば$'\n'、リテラルの改行文字に展開されます。これは、通常の bash 文字列リテラル ('...'または"...") では実行できないことです。[1]

もう 1 つの興味深い機能は、 ANSI C で引用符で囲まれた文字列を(単一引用符で) としてエスケープできる'\''...'ことです。

echo $'Honey, I\'m home' # OK; this cannot be done with '...'

サポートされているエスケープ シーケンスのリスト:

バックスラッシュのエスケープ シーケンスが存在する場合は、次のようにデコードされます。

\アラート (ベル)

\b バックスペース

\e \E エスケープ文字 (ANSI C ではない)

\f フォーム フィード

\n 改行

\r 改行

\t 水平タブ

\v 垂直タブ

\ バックスラッシュ

\' 一重引用符

\" 二重引用符

\nnn 値が 8 進数値 nnn (1 ~ 3 桁) である 8 ビット文字

\xHH 値が 16 進値 HH (1 桁または 2 桁の 16 進数) である 8 ビット文字

\uHHHH 値が 16 進値 HHHH (1 から 4 桁の 16 進数) である Unicode (ISO/IEC 10646) 文字

\UHHHHHHHH 値が 16 進値 HHHHHHHH (1 ~ 8 桁の 16 進数) である Unicode (ISO/IEC 10646) 文字

\cx control-x 文字

展開された結果は、ドル記号がなかったかのように単一引用符で囲まれます。


[1] ただし、 「...」および「...」文字列に実際の改行を埋め込むことはできます。つまり、複数行にわたる文字列を定義できます。

于 2015-03-13T02:56:53.637 に答える
16

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

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

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

于 2010-11-08T21:35:18.383 に答える
8

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

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

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

于 2013-04-08T22:42:24.073 に答える
-8

変数から値を取得するようなものです。

VAR='test'
echo VAR
echo $VAR

は異なるため、ドル記号は基本的に内容を評価します。

于 2010-11-08T21:37:01.547 に答える