2017-01-10 4 views
3

私はBashバージョン4.2.25を実行しています。ここに私のコードです:

#!/usr/bin/env bash 

string="one:two:three:four" 

# without quotes 
IFS=: read -ra array_1 <<< $string 
for i in "${array_1[@]}"; do printf "i = [$i]\n"; done 
# output: 
# i = [one two three four] 

# with quotes 
IFS=: read -ra array_2 <<< "$string" 
for i in "${array_2[@]}"; do printf "i = [$i]\n"; done 
# output: 
# i = [one] 
# i = [two] 
# i = [three] 
# i = [four] 

どのような動作の違いについて説明しますか?

答えて

2

Linuxでbash 4.2.46およびbash 4.3.30で問題を再現できません。

変数は、実際のスペースで分割されていないため、この問題が発生
string="one:two:three:four" 
IFS=: 

read -ra array_1 <<< $string 
for i in "${array_1[@]}"; do printf "i = [$i]\n"; done 
# i = [one two three four] 

read -ra array_2 <<< "$string" 
for i in "${array_2[@]}"; do printf "i = [$i]\n"; done 
# i = [one] 
# i = [two] 
# i = [three] 
# i = [four] 

、それらは$IFSに分割している(これはスペース、タブや改行デフォルト):ただし、ここで説明する動作を示してい適応したバージョンです。

$IFSがオーバーライドされているため、引用符は注意してください。スペースはもはや重要ではありません。

ソースコードは、write_here_stringで呼び出されたstring_listのBash hardcodes a spaceを示しています。 IFSにスペースが含まれていない場合、複数の単語に展開される文字列は、同様の行に沿ってトークンに変換されなくなり、その違いがより顕著になります。

PS:これは、われわれが変数に何が含まれているかを知っていても、変数を常に引用する必要がある理由の良い例です。

1

これはバグのようです。私はCHANGESを振り返り、何も特定できませんでしたが、cygwin bash 4.3.48(8)では、引用符と引用符の両方が期待される出力(4行)を示しています。私が帯域幅を持っているときに、repoをクローンして、redir.cを責めて、関連するコミットが見つかるかどうか確認します。

+0

これは実際には4.3で部分的に取り上げられ、4.4で完了したバグです。 – chepner

関連する問題