试图将一个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
本地值进行分词,产生分别指定给var1
和var2
hello
和world
。
错误是这里的string似乎经历了部分分裂使用IFS
被传递read
的“泄漏”值。 结果,这个string变成了hello world
,但是仍然被read
为一个单词。 由于该单词不包含:
,所以read
不会将其分成两个单词,并且整个string被分配给var1
。
在bash
4.3中,如文档所述, $var
的扩展不会作为<<<
操作符的参数进行分词。 代码
var="hello:1:2 world" IFS=: read var1 var2 <<< $var
设置var1
为hello
和var2
为1:2 world
。