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

Bash 无法拆分包含$作为分隔符的变量中存储的字符串,bash,shell,Bash,Shell,我尝试拆分此字符串并将子字符串存储在单独的变量中,如下所示: temp="one$two$three$fourfive" IFS="$" read var1 var2 var3 var4 <<< "$temp" 我如何解决这个问题?问题不在于阅读它们,而是当您首先分配到temp时。变量在双引号内展开,因此它尝试使用$two、$two等值。由于这些变量不存在,您只需要执行以下操作: temp="one" 如果你只是这样做,你就会注意到这一点: echo "$temp" 您需

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

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

我如何解决这个问题?

问题不在于阅读它们,而是当您首先分配到
temp
时。变量在双引号内展开,因此它尝试使用
$two
$two
等值。由于这些变量不存在,您只需要执行以下操作:

temp="one"
如果你只是这样做,你就会注意到这一点:

echo "$temp"
您需要使用单引号而不是双引号,这样变量就不会展开

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

如果“$”读取var1 var2 var3 var4您的问题在于原始字符串
temp
中有双引号,其余字符串
2
3
fourfive
被解释为shell变量

temp
字符串上使用单引号可以使变量不扩展为空字符串

temp='one$two$three$fourfive'
还建议使用带有
-r
标志的
read
,以免反斜杠损坏字符串

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

IFS='$'read-r var1 var2 var3 var4不需要使用
read
,一个
bash
数组比单独的变量更好:

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

one
two
three
fourfive

或者简单地创建一个分割值数组,例如,
IFS=$'$\n';数组=($(echo$tmp))
@DavidC.Rankin,使用
tmp='-n$/*'
进行测试。
tmp='-n$/*'
来自哪里?我以为问题是
temp=“一$二$三$四五”
?Barath R,请注意,问题中的代码(即使使用Inian解决方案中给出的引用和
read
用法修复)并不适用于
$temp
的所有可能值。特别是,如果字符串包含换行符,则会失败。使用
temp=$'a\nb$c$d$e'
进行测试。有关一般问题的许多解决方案,请参阅。不幸的是,许多解决方案并非在所有情况下都有效。gniourf_gniourf的解决方案很好。请使用
temp='a b$/*'
@pjh进行测试,谢谢,但除非OP指定数据可能会丢失。大多数*nix工具的设计都假定输入数据是正常的,或者至少是预清理的。如果数据不能被清理,那么使用一种安全的语言将是一个胜利。
one
two
three
fourfive