「IFS = $」の「\ n」\ n 'は変数ですか?


12

改行を設定IFSするには、接頭辞として$を使用する必要があることに注意してください

IFS=$'\n'

ただし、コロンを設定する場合は、

IFS=:

ある\n変数がありますか?

回答:


21

こと$'...'bash、拡張パラメータではありません、それはによって導入引用の特別なものだksh93それはそれらを展開し\n\x0a\12改行文字のコード。zshも追加されました\u000aksh93そして、bashも持ってい\cjながら、zsh持っています\C-Jksh93のようなバリエーションもサポートしています\x{a}

これ$は、何らかの形または拡張であるという手がかりです。しかし、いずれにしても、それは拡張の他の形態と異なる点は、使用$(のような$((1 + 1))$paramあるいは$(cmd)(ここでは二重引用符やドキュメントの内部で行われていないという点で)echo "$'x'"出力$'x'POSIXあたり不定ですが、すべてのシェルで)とその拡張は、分割の対象ではありません+ glob、展開演算子よりも引用演算子に間違いなく近い。

IFS=\nIFSを設定しますn\引用オペレータとして扱われる)と、IFS="\n"またはIFS='\n'2つの文字は、バックスラッシュにIFSを設定することになりますn

以下も使用できます。

IFS='
'

または

IFS="
"

または

IFS=$'
'

リテラルの改行を渡すには、それは読みにくいですが(そのコードに他のスペース文字が含まset listれているviかどうかなどを使用する以外は見ることができません$IFS)。

IFS=:IFS=':'IFS=":"IFS=$':'の全てのセットIFS :は、使用、それは問題ではありませんので。

$'...':少なくともによって(バリエーションで)支持されているksh93zshbashmksh、busyboxのsh、FreeBSDのshksh93そして、bashも持っている$"..."ことはめったに展開と移植性と確実に使用することの面倒として使用していないですけれども、テキストのローカライズに使用する引用符の形を。

esそしてfishシェルも使用することができ\n、改行に展開する外部の引用符の。

のような一部のツールはprintf、一部の実装であるechoか、それ自体をawk拡張することもでき\nます。たとえば、次のことができます。

printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only

改行文字を出力しますが、次のことに注意してください。

IFS = $(printf '\ n')

コマンド置換($(...))が後続の改行文字をすべて削除するため、機能しません。ただし、以下を使用できます。

eval "$(printf 'IFS="\n"')"

これは、改行ではなく文字で出力がprintf終了するため機能"します。

さて、完全を期すために、rcシェルとその派生物(esまたはのようなakanga)では、$'\n'実際にその\n変数(名前が2文字\とのシーケンスである変数n)が展開されています。これらのシェルでは、変数名に含めることができる文字に制限はなく、引用符のタイプは1つのみです'...'

$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo

rc変数もすべて環境にエクスポートされますが、少なくとものUnixバリアントではrc、などの変数名の場合\n、環境変数のバージョンはエンコード形式になります。

; env | grep foo | sed -n l
__5cn=foo\001bar$

0x5cASCIIのバイト値である\。その配列変数が区切り文字として0x1バイトでエンコードされた方法も参照)。


1
+1通常の非人間的なレベルの知識
スティーブンペニー


6

のような文字列は、POSIX標準$'\n'によって導入されてksh93おり、現在はPOSIX標準の一部ではありません。

これらは、ほとんどのC同様のエスケープ、$'\u2345'およびでサポートされているエスケープを使用できますecho

(ksh93またはbashの場合)そのエスケープメソッドを使用したくない場合でも、以下を使用できます。

IFS='
'

これは同等ですが、読みにくいです。

ところで、この拡張機能は既にPOSIX標準コミッティーに合格していますが、現在のバグのリストに遅れをとる必要があるため、2020年までには表示されないSUSv8が予定されています。


$'...'拡張は、のとは異なりますecho。それらは、のフォーマット引数用のものに似ていますprintf。for echoには0が必要です\0123$'...'printf\0123\012
。for

1
$'...'仕様はまだ議論されていることに注意してください。現在提案されている表現では、まだ解決すべきいくつかの問題があります。
ステファンシャゼラス

IIRC、閉鎖されましたが、再開されました。有効になるまでにまだ十分な時間がありますので、実際の問題は見当たりません。
18年

1
それは閉じられ、私はいくつかの異議を提起し、再び開かれ、それから修正され、まだいくつかの問題があり(そのほとんどは\uxxxx拡張に関する)、既存の実装に対応する解決策はありません。そのため、次のPOSIXバージョンには入らないかもしれません。たぶん、彼らは\uxxxxissue8のために拡張を省くことができたので、少なくとも私たちはまだ持つことができ$'\n'ます。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.