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 |
这里是对阿什拉齐答案的一个变化,它不依赖于
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 |
这里我用了一个换行符,但是你可以用一个制表符"
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"[^;]*"将选择任何不是";"的内容,因此将字符串拆分为";"。
希望有所帮助。