发布于 2009-09-10 19:02:13
您可以跳过显式创建数组的步骤...
我喜欢使用的一个技巧是将字段间分隔符(IFS)设置为定界符。这对于遍历空格或从许多unix命令的stdout中返回分隔结果特别方便。
下面是一个使用分号的示例(正如您在问题中所提到的):
export IFS=";"
sentence="one;two;three"
for word in $sentence; do
echo "$word"
done
注意:在常规的Bourne-shell脚本设置中,导出IFS将在两个单独的行上进行(IFS='x';导出IFS;)。
发布于 2009-09-10 19:44:53
如果你不想弄乱IFS (也许是为了循环中的代码),这可能会有所帮助。
如果知道字符串中没有空格,可以用空格替换';‘,并使用for/in结构:
#local str
for str in ${STR//;/ } ; do
echo "+ \"$str\""
done
但是,如果您可能有空格,那么对于这种方法,您将需要使用temp变量来保存"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
发布于 2009-09-10 19:25:53
这是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
的优点-它不仅可以启用分隔符,还可以禁用默认分隔符。只需确保在更改它之前保存它的值--就像其他人建议的那样。
https://stackoverflow.com/questions/1406966
复制相似问题