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

おすすめ記事