在bash脚本中,如何使用;
之类的分隔符拆分字符串并循环生成数组?
答案 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