试图将一个string分成两个variables

我试图将一个string分成两个variables(不必使用while循环):

var="hello:world" IFS=':' read var1 var2 <<< $var echo "var1: $var1" echo "var2: $var2" 

但我没有得到所需的结果:

 var1: 'hello world' var2: '' 

有人可以解释一下,如果可以这样做(或类似的方式)吗?

这是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= 

未来读者的FYI:

在和开发人员讨论这个之后,看起来确实是bash 4.2中的一个bug,并且在即将发布的4.3版本中已经修复了。 从devel分支更改日志

RRRR。 修复了IFS出现在临时环境中并用于redirect时的几个问题。

尽pipe引用参数扩展总是一个好主意,但OP的代码应该按照预期的方式工作而不用引号。


这是一个错误的解释。 用代码

 var="hello:world" IFS=':' read var1 var2 <<< $var 

不加引号的$var 应该是一个单词,因为它在IFS的全局值(即,没有空白)中不包含任何字符。 read应该看到stringhello:world 。 因为它收到了两个参数,所以它应该使用IFS本地值进行分词,产生分别指定给var1var2 helloworld

错误是这里的string似乎经历了部分分裂使用IFS被传递read的“泄漏”值。 结果,这个string变成了hello world ,但是仍然被read为一个单词。 由于该单词不包含: ,所以read不会将其分成两个单词,并且整个string被分配给var1

bash 4.3中,如文档所述, $var的扩展不会作为<<<操作符的参数进行分词。 代码

 var="hello:1:2 world" IFS=: read var1 var2 <<< $var 

设置var1hellovar21:2 world