Bashでこれら3つのコードブロックの間に違いはありますか?
使用IFS=
:
#!/usr/bin/env bash
while IFS= read -r item; do
echo "[$item]"
done </dev/stdin
使用IFS=$'\n'
:
#!/usr/bin/env bash
while IFS=$'\n' read -r item; do
echo "[$item]"
done </dev/stdin
使用-d $'\n'
:
#!/usr/bin/env bash
while read -rd $'\n' item; do
echo "[$item]"
done </dev/stdin
IFS
2つの値と区切り文字オプションに違いがある場合、-d
どのような状況で違いが発生しますか?
私のテストによると、すべて同じように見えます。
echo $'one two\nthree\tfour' | test-stdin
# outputs:
# [one two]
# [three four]
ベストアンサー1
IFS=
とIFS=$'\n'
同じですread
(read
区切り文字がデフォルトから変更されていないと仮定)。唯一の違いは、行内の改行が単語を区別するかどうか、改行が行の中に表示されないかどうかです。
read
(newline)がデフォルトの区切り文字であるread -d $'\n'
ため、同じです。$'\n'
IFS=
そしてIFS=$'\n'
フィールド分割に影響を与えます。IFS=
フィールド分割は完全にオフになり、IFS=$'\n'
代わりに改行文字に分割されます。
IFS=$'\n'
echo $(echo a; echo b)
# prints "a b" on a single line since $'a\nb' is split at
# the newline and therefore echo receives two arguments "a" and "b"
IFS=
echo $(echo a; echo b)
# prints "a" and "b" on separate lines $'a\nb' is passed
# as a single argument to echo