<<<
次のコード ブロック内のbash の 3 桁未満の演算子 , は何を意味しますか?
LINE="7.6.5.4"
IFS=. read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"
また、なぜ は$IFS
ピリオドではなくスペースのままなのですか?
<<<
次のコード ブロック内のbash の 3 桁未満の演算子 , は何を意味しますか?
LINE="7.6.5.4"
IFS=. read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"
また、なぜ は$IFS
ピリオドではなくスペースのままなのですか?
文字列をコマンドの stdin にリダイレクトします。
この方法でコマンドの直前に割り当てられた変数は、コマンド プロセスに対してのみ有効です。シェルはそのままです。
からman bash
Here Strings here ドキュメントの変形で、形式は次のとおりです。
<<<word
単語は展開され、標準入力でコマンドに提供されます。
IFS 行のは、bash.
と同等です。source
更新:man bash
(gsklee、seheに感謝)からの詳細
IFS 展開後の単語分割、およびread 組み込みコマンドで行を単語に分割するために使用される内部フィールド セパレータ 。デフォルト値は "
<space><tab><new‐line>
" です。
からさらにman bash
上記の PARAMETERS で説明されているように、単純なコマンドまたは関数の環境は、パラメーターの割り当てを前に付けることで一時的に拡張できます。これらの代入ステートメントは、そのコマンドによって表示される環境のみに影響します。
IFS が設定されていない理由は、bash がそれを別のコマンドとして認識していないためです。コマンドを終了するには、コマンドの後に改行またはセミコロンを付ける必要があります。
$ cat /tmp/ifs.sh
LINE="7.6.5.4"
IFS='.' read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"
$ bash /tmp/ifs.sh
7 6 5 4
しかし
$ cat /tmp/ifs.sh
LINE="7.6.5.4"
IFS='.'; read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"
$ bash /tmp/ifs.sh
.
7 6 5 4
ただし、最初の方法で構文エラーにならなかった理由はわかりません。