尝试将字符串分成两个变量

我正在尝试将字符串分成两个变量(而不必使用while循环):


var="hello:world"

IFS=':' read var1 var2 <<< $var


echo "var1: $var1"

echo "var2: $var2"

但我没有得到预期的结果:


var1: 'hello world'

var2: ''

有人可以解释一下是否可以这种方式(或类似方式)吗?


DIEA
浏览 431回答 3
3回答

慕慕森

这是Bash 4.2中的错误。请参阅chepner的答案以获取适当的解释。这是关于报价。采用:IFS=':' read var1 var2 <<< "$var"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^&nbsp; &nbsp; ^代替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=

汪汪一只猫

供未来读者参考:与开发人员讨论此问题后,看来这确实是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。

千巷猫影

这是我不理解的(我不是在争辩,只是在不理解)。的设置IFS应引用在其中read执行的环境,但应$var作为输入重定向的一部分进行扩展,该环境应在执行之前read。此外,在不加引号的情况下,字符串似乎确实是一个单词,分配给var1,然后拆分为var1gets&nbsp;hello和world,而不是hello:world。
打开App,查看更多内容
随时随地看视频慕课网APP