
IFS
改行設定の前には$が付く必要があることがわかりました。
IFS=$'\n'
しかし、コロンを設定すると
IFS=:
\n
変数ですか?
答え1
これはパラメータ拡張で$'...'
はなく、対応するコードを改行文字に拡張するbash
特別な引用です。対応するUnicodeコードポイントを持つ文字については/も追加されました。そしてそれはしばらくでした。また、以下のことをサポートします。ksh93
\n
\x0a
\12
zsh
\u000a
\U0000000a
ksh93
bash
\cj
zsh
\C-J
ksh93
\x{a}
これは$
どのような形や拡張であることを暗示するものです。ただし、とにかく二重引用符やこの文書内では実行されず(POSIXでは指定されていませんが、すべてのシェルからの出力)、拡張が分割されていないという点で(たとえば、$
または$((1 + 1))
)$param
を使用する他の形式の拡張とは異なります。 +glob、スプレッド演算子よりも参照演算子に近い。$(cmd)
echo "$'x'"
$'x'
IFS=\n
n
IFSは(\
参照演算子として扱われます)に設定され、IFS="\n"
IFSIFS='\n'
はバックスラッシュと2文字に設定されますn
。
以下も使用できます。
IFS='
'
または
IFS="
"
または
IFS=$'
'
set list
リテラル改行を渡すにはあまり明確ではありませんが(誰もがコードに他の空白文字があるかどうかなどのものを使用する以外にはvi
見えません)。$IFS
IFS=:
IFS=':'
、、、すべてIFSをに設定するので、IFS=":"
どちらを使用しても構いません。IFS=$':'
:
$'...'
少なくとも、以下(バリアントを含む)でサポートされています:ksh93
、、、、、busybox 、FreeBSD 。また、テキストローカライゼーションのための引用形式もありますが、移植性と信頼性のために展開して使用するのは面倒で、ほとんど使用されません。zsh
bash
mksh
sh
sh
ksh93
bash
$"..."
また、es
シェルは外部から引用符を使用して改行文字に拡張するfish
こともできます。\n
たとえば、一部のツールやprintf
Pythonの一部の実装も独自に拡張できます。たとえば、次のようにできます。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
orakanga
など)は、実際にはその変数(名前が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$
(0x5c
ASCIIのバイト値です\
。0x1バイトを区切り文字として使用してこの配列変数をエンコードする方法も参照してください。)
答え2
これはANSI-Cの引用:
この形式の単語は
$'string'
特に扱われます。ワードは、string
ANSI C規格で指定されているように置き換えられたバックスラッシュエスケープ文字を使用して拡張されます。
したがって、$'\n'
改行文字に置き換えられます。
これは何の関係もないシェルパラメータ拡張、自由に使用してください$
。
答え3
このような文字列は$'\n'
POSIX標準によって導入されましたが、ksh93
現在POSIX標準の一部ではありません。
$'\u2345'
でサポートされているエスケープ文字など、ほとんどのCに似たエスケープ文字を使用できますecho
。
このエスケープ方法を使用したくない場合(ksh93またはbashの場合)、次のものを引き続き使用できます。
IFS='
'
これは同じですが、読みにくいです。
注:この拡張はPOSIX標準委員会によって承認されていますが、次に計画されています。SUSv8現時点では、バグリストの背後にある問題を最初に解決する必要があるため、2020年以前はこれが発生しないと予想されます。