我在使用read
命令时遇到了一个奇怪的行为,当它们仍旧会进行单词拆分时(在bash
的较早版本中),这里的字符串没有用引号引起来。请查看以下片段:
此处echo $line
在IFS=:
上分割并产生echo a b c
-确定:
IFS=:
line=a:b:c
echo $line | { read -ra arr; declare -p arr; }
输出:
declare -a arr='([0]="a b c")'
echo $line
的结果为echo a:b:c
,因为它不包含默认值IFS
和read
中的任何字符,然后在IFS=:
上分割并正确地填充了数组- 确定:
unset IFS
line=a:b:c
echo $line | { IFS=: read -ra arr; declare -p arr; }
输出:
declare -a arr='([0]="a" [1]="b" [2]="c")'
问题:
unset IFS
line=a:b:c
echo $line # outputs correctly a:b:c
IFS=: read -ra arr <<< $line
declare -p arr
输出:
a:b:c
declare -a arr='([0]="a b c")'
此处<<< $line
应该产生<<< a:b:c
,因为$line
不包含IFS
中的任何内容。 read
然后应该使用IFS=:
正确地填充数组,但是结果只有一个元素,以空格分隔。 为什么?
我使用的是GNU bash, version 4.1.17(1)-release (sparc-sun-solaris2.11)
,这里的字符串以前经常被单词分割。引用解决了的问题,但是我看不出在这种特殊情况下分词如何使事情变得混乱,因为即使echo $line ...
示例也可以正常工作。
在GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
(此处的字符串不再被分割)中,无引号和带引号的版本均能正常工作。
答案 0 :(得分:1)
这是bash 4.2版(显然是某些4.1.x版)中的一个已知错误,已在4.3版中修复。请参见此bug-bash thread,其中引用了this StackOverflow question; @chepner's answer中该问题的错误说明。