我正在尝试拆分此字符串并将子字符串存储在单独的变量中,如下所示:
temp="one$two$three$fourfive"
IFS="$" read var1 var2 var3 var4 <<< "$temp"
当我呼应var1时,我得到“ 1”,但是当我呼应var2时,没有输出。 当我在每个$符号前添加“ \”但尝试以编程方式进行操作时,它会起作用:
echo "$temp" | sed 's/$/\\$/g'
Output: one\$
我该如何解决?
答案 0 :(得分:4)
您的问题在于原始字符串temp
,其中用双引号将其余字符串two
,three
和fourfive
解释为外壳变量。
在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)
不需要使用read
,bash
数组比单独的变量要好:
temp='one$two$three$fourfive'
var=(${temp//$/ })
printf '%s\n' ${var[@]}
输出:
one
two
three
fourfive