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

Fun*_*ude 31 bash

可能重复:
基于Bash中的分隔符拆分字符串?

在bash脚本中,如何使用分隔符拆分字符串;并在结果数组中循环?

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;).

  • 我认为你应该在修改之前存储IFS,在temp变量中,并在完成后恢复它! (11认同)
  • 我建议在子shell中进行此操作(括在括号中)或保存和恢复IFS(OLDIFS ="$ IFS"...代码...导出IFS ="$ OLDIFS") - 可能会发生许多时髦的事情如果它没有设置好. (3认同)
  • 没有必要导出IFS.只需保存它`oldIFS = $ IFS`,设置它'IFS =';'`,做东西,然后恢复它`IFS = $ oldIFS`. (3认同)

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)

  • 为什么投票没有评论?你应该证明这一点...... (5认同)

Pau*_*ce. 9

这是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- 它不仅可以启用分隔符,还可以禁用默认分隔符.只需确保在更改之前保存其价值 - 正如其他人所建议的那样.