3 回答
TA贡献1856条经验 获得超17个赞
这是Bash 4.2中的错误。请参阅chepner的答案以获取适当的解释。
这是关于报价。采用:
IFS=':' read var1 var2 <<< "$var"
^ ^
代替
IFS=':' read var1 var2 <<< $var
查看结果:
$ IFS=':' read var1 var2 <<< "$var"
$ echo "var1=$var1, var2=$var2"
var1=hello, var2=world
但
$ IFS=':' read var1 var2 <<< $var
$ echo "var1=$var1, var2=$var2"
var1=hello world, var2=
TA贡献1898条经验 获得超8个赞
供未来读者参考:
与开发人员讨论此问题后,看来这确实是bash4.2中的错误,并已在即将发布的4.3版本中修复。从devel分支更改日志
rrrr。修复了IFS出现在临时环境中并用于重定向时的几个问题。
虽然无论如何都用引号引起来总是一个好主意,但是OP的代码应该按预期的方式工作而不用引号。
这是该错误的解释。用代码
var="hello:world"
IFS=':' read var1 var2 <<< $var
未加引号的$var 应该是一个单词,因为它的全局值中不包含任何字符IFS(即,不包含空格)。read然后应该看到字符串hello:world。由于它收到了两个参数,因此应该使用其局部值IFS,产生hello和world分别分配给var1和的单词拆分var2。
错误是,此处的字符串似乎使用IFS传递给的“泄漏”值进行了部分拆分read。结果,该字符串变为hello world,但仍被视为read一个单词。由于该单词不包含:,因此read请勿将其拆分为两个单词,并且将整个字符串分配给var1。
bash如所记录的,在4.3中,的扩展$var不进行单词拆分作为<<<运算符的参数。编码
var="hello:1:2 world"
IFS=: read var1 var2 <<< $var
设置var1到hello和var2到1:2 world。
TA贡献1829条经验 获得超7个赞
这是我不理解的(我不是在争辩,只是在不理解)。的设置IFS
应引用在其中read
执行的环境,但应$var
作为输入重定向的一部分进行扩展,该环境应在执行之前read
。此外,在不加引号的情况下,字符串似乎确实是一个单词,分配给var1
,然后拆分为var1
gets hello
和world
,而不是hello:world
。
- 3 回答
- 0 关注
- 430 浏览
添加回答
举报