试图将一个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 。