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

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

IFS改行設定の前には$が付く必要があることがわかりました。

IFS=$'\n'

しかし、コロンを設定すると

IFS=:

\n変数ですか?

答え1

これはパラメータ拡張で$'...'はなく、対応するコードを改行文字に拡張するbash特別な引用です。対応するUnicodeコードポイントを持つ文字については/も追加されました。そしてそれはしばらくでした。また、以下のことをサポートします。ksh93\n\x0a\12zsh\u000a\U0000000aksh93bash\cjzsh\C-Jksh93\x{a}

これは$どのような形や拡張であることを暗示するものです。ただし、とにかく二重引用符やこの文書内では実行されず(POSIXでは指定されていませんが、すべてのシェルからの出力)、拡張が分割されていないという点で(たとえば、$または$((1 + 1))$paramを使用する他の形式の拡張とは異なります。 +glob、スプレッド演算子よりも参照演算子に近い。$(cmd)echo "$'x'"$'x'

IFS=\nnIFSは(\参照演算子として扱われます)に設定され、IFS="\n"IFSIFS='\n'はバックスラッシュと2文字に設定されますn

以下も使用できます。

IFS='
'

または

IFS="
"

または

IFS=$'
'

set listリテラル改行を渡すにはあまり明確ではありませんが(誰もがコードに他の空白文字があるかどうかなどのものを使用する以外にはvi見えません)。$IFS

IFS=:IFS=':'、、、すべてIFSをに設定するので、IFS=":"どちらを使用しても構いません。IFS=$':':

$'...'少なくとも、以下(バリアントを含む)でサポートされています:ksh93、、、、、busybox 、FreeBSD 。また、テキストローカライゼーションのための引用形式もありますが、移植性と信頼性のために展開して使用するのは面倒で、ほとんど使用されません。zshbashmkshshshksh93bash$"..."

また、esシェルは外部から引用符を使用して改行文字に拡張するfishこともできます。\n

たとえば、一部のツールやprintfPythonの一部の実装も独自に拡張できます。たとえば、次のようにできます。echoawk\n

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

改行が出力されますが、次の点に注意してください。

IFS=$(printf '\n')

$(...)コマンド置換()がすべての末尾の改行を削除するため、機能しません。ただし、次のものを使用できます。

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

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

完全性のために、rcシェルと派生項目(esorakangaなど)は、実際にはその変数(名前が2文字の合計シーケンスである変数)$'\n'の拡張です。\nこれらのシェルには変数名に含めることができる文字に制限はありません。引用符の種類は 。\n'...'

$ 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バイトを区切り文字として使用してこの配列変数をエンコードする方法も参照してください。)

答え2

これはANSI-Cの引用:

この形式の単語は$'string'特に扱われます。ワードは、stringANSI C規格で指定されているように置き換えられたバックスラッシュエスケープ文字を使用して拡張されます。

したがって、$'\n'改行文字に置き換えられます。

これは何の関係もないシェルパラメータ拡張、自由に使用してください$

答え3

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

$'\u2345'でサポートされているエスケープ文字など、ほとんどのCに似たエスケープ文字を使用できますecho

このエスケープ方法を使用したくない場合(ksh93またはbashの場合)、次のものを引き続き使用できます。

IFS='
'

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

注:この拡張はPOSIX標準委員会によって承認されていますが、次に計画されています。SUSv8現時点では、バグリストの背後にある問題を最初に解決する必要があるため、2020年以前はこれが発生しないと予想されます。

関連情報