本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Split string based on delimiter in Bash?
在bash脚本中,如何使用像;这样的分隔符拆分字符串并循环遍历生成的数组?
以什么方式拆分字符串?
这听起来像是家庭作业。不管怎样,到目前为止你都试过什么?张贴一些你正在尝试的东西。
不是家庭作业问题。只是不熟悉shell脚本。我一直在谷歌搜索,但没有找到我想要的东西。
您可以跳过显式创建数组的步骤…
我喜欢使用的一个技巧是将字段间分隔符(IFS)设置为分隔符字符。这对于遍历空间或从stdout返回分隔结果特别方便,这些结果来自许多unix命令中的任何一个命令。
下面是使用分号的示例(正如您在问题中提到的那样):
export IFS=";"
sentence="one;two;three"
for word in $sentence; do
echo"$word"
done
注意:在常规BourneShell脚本设置和导出中,IFS将出现在两个单独的行上(ifs='x';export ifs;)。
我认为您应该在修改它之前将ifs存储在一个temp变量中,并在完成之后将其恢复!!
我建议您要么在子shell中执行此操作(用括号括起来),要么保存和恢复ifs(oldifs="$ifs"…代码…export ifs="$oldifs")-如果设置不正确,可能会发生很多奇怪的事情。
谢谢。我正在使用这个脚本,并根据jefromi保存和恢复ifs。但我得到这个错误导出:=:变量名不正确我做错什么了吗?
不需要出口国际单项体育联合会。只需保存它oldIFS=$IFS,设置它IFS=';',做一些事情,然后恢复它IFS=$oldIFS。
你救了我,谢谢
我将使用exprt ifs=",",因为如果输入是从参数馈送的,那么包含;的参数的含义可能与分隔符的含义不同。
如果您不想处理ifs(可能是循环中的代码),这可能会有所帮助。
如果知道字符串没有空格,可以用空格替换";",并使用for/in构造:
#local str
for str in ${STR//;/ } ; do
echo"+ "$str""
done
但是,如果您可能有空白,那么对于这种方法,您需要使用一个临时变量来保存"rest",如下所示:
#local str rest
rest=$STR
while [ -n"$rest" ] ; do
str=${rest%%;*} # Everything up to the first ';'
# Trim up to the first ';' -- and handle final case, too.
["$rest" ="${rest/;/}" ] && rest= || rest=${rest#*;}
echo"+ "$str""
done
为什么投反对票却没有评论?你应该证明…
我使用第一种方法使用${STR//;/ }语法。但是我现在有一个问题,如果我传递一个没有分隔符的字符串,它会给出一个错误:"替换错误"。我想把这样的字符串当作一个带有一个元素的数组。你有什么解决这个问题的建议吗?
这里是对阿什拉齐答案的一个变化,它不依赖于$IFS。它确实有自己的问题,我将在下面讨论。
sentence="one;two;three"
sentence=${sentence//;/$'
'} # change the semicolons to white space
for word in $sentence
do
echo"$word"
done
这里我用了一个换行符,但是你可以用一个制表符"\t"或空格。但是,如果这些字符中有任何一个在文本中,它也将在文本中被拆分。这就是EDOCX1的优点(0)——它不仅可以启用分隔符,而且可以禁用默认分隔符。只需确保在您更改它之前保存它的值——正如其他人建议的那样。
你只需做一个for word in ${sentence//;/$'
'}(省略第二个任务)。要只在换行符上循环,可以执行类似于echo ${sentence//;/$'
'} | while read elem; do echo"$elem"; done的操作。
sentence="one;two;three"
a="${sentence};"
while [ -n"${a}" ]
do
echo ${a%%;*}
a=${a#*;}
done
下面是您可以使用的示例代码:
$ STR="String;1;2;3"
$ for EACH in `echo"$STR" | grep -o -e"[^;]*"`; do
echo"Found: "$EACH"";
done
grep-o-e"[^;]*"将选择任何不是";"的内容,因此将字符串拆分为";"。
希望有所帮助。
谢谢,但由于某种原因,它不会循环。它只输出
找到:"字符串"一次
@时髦的家伙:它是为我循环。
str前面的"$"和for表示shell提示,您省略了它。我非常肯定它能像我现在使用它一样工作。D
我把它拿出来放进了一个shell脚本
嗯。这很奇怪。我真的不知道为什么。不过,为了以防万一,看看我在这里做了什么:dl.getdropbox.com/u/1961549/images/it_works.jpg。
这只在字符串不包含空格时有效