use*_*447 56
您可以跳过显式创建数组的步骤...
我喜欢使用的一个技巧是将字段间分隔符(IFS)设置为分隔符字符.这对于迭代空间或从许多unix命令中的任何一个的stdout返回分隔结果特别方便.
下面是使用分号的示例(正如您在问题中提到的):
export IFS=";"
sentence="one;two;three"
for word in $sentence; do
echo "$word"
done
Run Code Online (Sandbox Code Playgroud)
注意:在常规Bourne-shell脚本设置和导出中,IFS将在两个单独的行上发生(IFS ='x'; export IFS;).
NVR*_*RAM 15
如果你不想搞乱IFS(可能是循环中的代码),这可能会有所帮助.
如果知道你的字符串不会有空格,你可以用' ; '使用空格并使用for/in结构:
#local str
for str in ${STR//;/ } ; do
echo "+ \"$str\""
done
Run Code Online (Sandbox Code Playgroud)
但是如果你可能有空格,那么对于这种方法,你需要使用一个临时变量来保持"休息",如下所示:
#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
Run Code Online (Sandbox Code Playgroud)
这是ashirazi的答案的变体,它不依赖于$IFS.它确实有自己的问题,我在下面列出.
sentence="one;two;three"
sentence=${sentence//;/$'\n'} # change the semicolons to white space
for word in $sentence
do
echo "$word"
done
Run Code Online (Sandbox Code Playgroud)
这里我使用了换行符,但你可以使用标签" \t"或空格.但是,如果文本中包含任何这些字符,它也会在那里分割.这样做的好处是$IFS- 它不仅可以启用分隔符,还可以禁用默认分隔符.只需确保在更改之前保存其价值 - 正如其他人所建议的那样.