为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2019-11-04 09:58:19
我正在尝试将字符串分成两个变量(而不必使用while循环):var="hello:world"IFS=':' read var1 var2 <<< $varecho "var1: $var1"echo "var2: $var2"但我没有得到预期的结果:var1: 'hello world'var2: ''有人可以解释一下是否可以这种方式(或类似方式)吗?
查看完整描述

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=


查看完整回答
反对 回复 2019-11-04
?
汪汪一只猫

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。


查看完整回答
反对 回复 2019-11-04
?
千巷猫影

TA贡献1829条经验 获得超7个赞

这是我不理解的(我不是在争辩,只是在不理解)。的设置IFS应引用在其中read执行的环境,但应$var作为输入重定向的一部分进行扩展,该环境应执行之前read。此外,在不加引号的情况下,字符串似乎确实是一个单词,分配给var1然后拆分为var1gets helloworld,而不是hello:world

查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 416 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信