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

时间:2009-09-10 18:36:37

标签: bash

  

可能重复:
  Split string based on delimiter in Bash?

在bash脚本中,如何使用;之类的分隔符拆分字符串并循环生成数组?

5 个答案:

答案 0 :(得分:53)

您可以跳过明确创建数组的步骤......

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

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

export IFS=";"
sentence="one;two;three"
for word in $sentence; do
  echo "$word"
done

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

答案 1 :(得分:11)

如果你不想搞乱IFS(可能是循环中的代码),这可能会有所帮助。

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

#local str
for str in ${STR//;/ } ; do 
   echo "+ \"$str\""
done

但是如果可能有空格,那么对于这种方法,您需要使用临时变量来保存“休息”,如下所示:

#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

答案 2 :(得分:8)

以下是 ashirazi的答案的变体,它不依赖于$IFS。它确实有自己的问题,我将在下面列出。

sentence="one;two;three"
sentence=${sentence//;/$'\n'}  # change the semicolons to white space
for word in $sentence
do
    echo "$word"
done

这里我使用了换行符,但您可以使用标签“\t”或空格。但是,如果文本中包含任何这些字符,它也会在那里分割。这是$IFS的优势 - 它不仅可以启用分隔符,还可以禁用默认分隔符。只需确保在更改之前保存其值 - 正如其他人所建议的那样。

答案 3 :(得分:1)

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

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

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

希望有所帮助。

答案 4 :(得分:1)

sentence="one;two;three"
a="${sentence};"
while [ -n "${a}" ]
do
    echo ${a%%;*}
    a=${a#*;}
done