关于bash:linux shell脚本:拆分字符串,将它们放入一个数组中,然后循环遍历它们

linux shell script: split string, put them in an array then loop through them

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Split string based on delimiter in Bash?

在bash脚本中,如何使用像;这样的分隔符拆分字符串并循环遍历生成的数组?


您可以跳过显式创建数组的步骤…

我喜欢使用的一个技巧是将字段间分隔符(IFS)设置为分隔符字符。这对于遍历空间或从stdout返回分隔结果特别方便,这些结果来自许多unix命令中的任何一个命令。

下面是使用分号的示例(正如您在问题中提到的那样):

1
2
3
4
5
export IFS=";"
sentence="one;two;three"
for word in $sentence; do
  echo"$word"
done

注意:在常规BourneShell脚本设置和导出中,IFS将出现在两个单独的行上(ifs='x';export ifs;)。


如果您不想处理ifs(可能是循环中的代码),这可能会有所帮助。

如果知道字符串没有空格,可以用空格替换";",并使用for/in构造:

1
2
3
4
#local str
for str in ${STR//;/ } ; do
   echo"+ "$str""
done

但是,如果您可能有空白,那么对于这种方法,您需要使用一个临时变量来保存"rest",如下所示:

1
2
3
4
5
6
7
8
#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


这里是对阿什拉齐答案的一个变化,它不依赖于$IFS。它确实有自己的问题,我将在下面讨论。

1
2
3
4
5
6
7
sentence="one;two;three"
sentence=${sentence//;/$'
'
}  # change the semicolons to white space
for word in $sentence
do
    echo"$word"
done

这里我用了一个换行符,但是你可以用一个制表符"\t"或空格。但是,如果这些字符中有任何一个在文本中,它也将在文本中被拆分。这就是EDOCX1的优点(0)——它不仅可以启用分隔符,而且可以禁用默认分隔符。只需确保在您更改它之前保存它的值——正如其他人建议的那样。


1
2
3
4
5
6
7
sentence="one;two;three"
a="${sentence};"
while [ -n"${a}" ]
do
    echo ${a%%;*}
    a=${a#*;}
done

下面是您可以使用的示例代码:

1
2
3
4
$ STR="String;1;2;3"
$ for EACH in `echo"$STR" | grep -o -e"[^;]*"`; do
    echo"Found: "$EACH"";
done

grep-o-e"[^;]*"将选择任何不是";"的内容,因此将字符串拆分为";"。

希望有所帮助。