$ IFS=";"
$ read first second
i am;a_i b c
$ echo $first
i am
$ echo $second
a_i b c
$ echo $IFS
- 私の言葉は正しいですか?これは
read first second
現在のシェルプロセスの子プロセスですか?それではなぜ必要ないのですかexport IFS=";"
? - なぜ空ですか
IFS
?
答え1
私の言葉は正しいですか?読んだ最初の瞬間は、現在のシェルプロセスの子プロセスですか?それでは、IFS = ";"をエクスポートする必要がないのはなぜですか?
read
一つでもないバッシュ組み込み関数。ここでは、サブシェルやサブプロセスは作成されませんIFS
。
IFSが空の理由は何ですか?
二重引用符を使用しなかったためです。 IFS値をに変更したので、拡張すると、;
シェルecho $IFS
は単語分割とワイルドカードを実行するための区切り文字として使用されます。これで何も印刷されません。$IFS
;
;
努力する:
$ IFS=";"
$ printf "%s\n" $IFS
$ printf "%s\n" "$IFS"
;
ノート
答え2
入力するとtype read
取得しますread is a shell builtin
。したがって、子プロセスとして実行されません。
答え3
IFSが空である理由に答えてください。そうではありません。しかし、その値はIFS
シェルの動作を変更することです。以下は説明ではなく、Debian Gnu + Linuxでbashを使用した実験の結果です。
a=";"; echo $a
生産する;
。
IFS=";"; echo $IFS
空行を生成します。
IFS=";"; echo "$IFS"
生産する;
。
今a=";"; echo $a
空の行が生成されますが、IFS=" "; a=";"; echo $a
再び;
。
だから
今IFS=";"; a=";"; echo $a
空の行を生成IFS=" "; a=";"; echo $a
します;
が。
したがって、IFS値は動作を変更します(エコーに引用符を使用しません)。
答え4
IFS=\;; set -- $IFS; echo $#; echo "$*"
1
;
IFS=; set -- $IFS; echo $#; echo "$*"
0
#there doesn't seem to be anything here
ご覧のとおり、最初の$IFS
ケースでは空ではなく、フィールド区切り文字のみが含まれています。
シェルが引用符で囲まれていない変数を展開するときに定義された区切り文字に従って値を分割します$IFS
。これにより、各変数を$IFS
別々の配列にすることができます。デフォルトでは、$IFS
a <space>
、\t
ab、\n
ewlineに設定されています。これらのそれぞれは特別な$IFS
特性を持っています。$IFS
スペース。 $IFS
スペース区切り文字は保持されず、シェルがトークン化を実行すると、すべてのシーケンスは単一のフィールドに切り捨てられ、他のすべてのシーケンスには区切り文字ごとに1つのフィールドがあります。$IFS
スペースまた、フィールドの開始または終了から完全に削除されます。たとえば、
IFS=/; slashes=///////; printf '<%s>' $slashes
<><><><><><><>
IFS=' '; spaces=' '; printf '<%s>' $spaces
<>
printf '<%s>' $spaces$slashes
<///////>
しかし、$IFS
スペース確かにいいえ削除されるといいえ存在する$IFS
:
IFS=/; printf '<%s>' $spaces$slashes
< ><><><><><><>