无法拆分存储在包含$作为分隔符的变量中的字符串

时间:2019-02-14 08:16:44

标签: bash shell

我正在尝试拆分此字符串并将子字符串存储在单独的变量中,如下所示:

temp="one$two$three$fourfive"
IFS="$" read var1 var2 var3 var4 <<< "$temp"

当我呼应var1时,我得到“ 1”,但是当我呼应var2时,没有输出。 当我在每个$符号前添加“ \”但尝试以编程方式进行操作时,它会起作用:

echo "$temp" | sed 's/$/\\$/g'

Output: one\$

我该如何解决?

3 个答案:

答案 0 :(得分:4)

您的问题在于原始字符串temp,其中用双引号将其余字符串twothreefourfive解释为外壳变量。

temp字符串上使用单引号会使的变量扩展为空字符串。

temp='one$two$three$fourfive'

还建议将read-r标志一起使用,以免反斜杠损坏字符串

IFS='$' read -r var1 var2 var3 var4 <<< "$temp"

答案 1 :(得分:3)

问题不在于阅读它们,而是您首先分配给temp的时候。变量在双引号内展开,因此它尝试使用$two$three等的值。由于这些变量不存在,您只需要这样做:

temp="one"

如果您只是这样做,您会注意到这一点:

echo "$temp"

您需要使用单引号而不是双引号,因此不会扩展变量。

temp='one$two$three$fourfive'
IFS="$" read var1 var2 var3 var4 <<< "$temp"

答案 2 :(得分:1)

不需要使用readbash数组比单独的变量要好:

temp='one$two$three$fourfive'
var=(${temp//$/ })
printf '%s\n' ${var[@]}

输出:

one
two
three
fourfive