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

Posted

技术标签:

【中文标题】linux shell脚本:拆分字符串,将它们放在一个数组中然后循环它们[重复]【英文标题】:linux shell script: split string, put them in an array then loop through them [duplicate] 【发布时间】:2010-11-27 06:38:54 【问题描述】:

可能重复:Split string based on delimiter in Bash?

在 bash 脚本中,如何使用 ; 之类的分隔符拆分字符串并循环遍历生成的数组?

【问题讨论】:

这听起来像是家庭作业。无论如何,到目前为止您尝试过什么?发布一些表明您正在尝试的内容。 不是作业问题。只是不熟悉shell脚本。我一直在谷歌搜索,但没有找到我想要的东西。 【参考方案1】:

这是一个您可以使用的示例代码:

$ STR="String;1;2;3"
$ for EACH in `echo "$STR" | grep -o -e "[^;]*"`; do
    echo "Found: \"$EACH\"";
done

grep -o -e "[^;]*" 将选择任何不是';'的东西,因此用';'分割字符串。

希望有所帮助。

【讨论】:

谢谢,但由于某种原因,它不会循环。它只输出 @Funky Dude:它为我循环播放。 STR 和 for 前面的 '$' 表示 shell 提示符,你可以省略它。我很确定它在我现在使用它时会起作用。 :D 我确实把它拿出来放在了一个shell脚本中 嗯。这很奇怪。我真的不知道为什么。不过,以防万一,看看我在这里做了什么:dl.getdropbox.com/u/1961549/images/It_works.jpg。【参考方案2】:

您可能可以跳过显式创建数组的步骤...

我喜欢使用的一个技巧是将字段间分隔符 (IFS) 设置为分隔符。这对于遍历空间或从许多 unix 命令的标准输出返回分隔结果特别方便。

以下是使用分号的示例(正如您在问题中提到的那样):

export IFS=";"
sentence="one;two;three"
for word in $sentence; do
  echo "$word"
done

注意:在常规的 Bourne-shell 脚本设置和导出 IFS 将发生在两个单独的行 (IFS='x'; export IFS;)。

【讨论】:

我认为您应该在修改 IFS 之前将其存储在一个临时变量中,并在完成后将其恢复!! 我建议在子外壳中执行此操作(用括号括起来)或保存和恢复 IFS (OLDIFS="$IFS" ...code... export IFS="$OLDIFS") - 如果设置不正确,可能会发生很多奇怪的事情。 谢谢。我正在使用这个脚本,并根据 jefromi 保存和恢复 ifs。但我得到这个错误导出:=:错误的变量名我做错了吗? IFS 不需要导出。只需保存它oldIFS=$IFS,设置它IFS=';',做一些事情,然后恢复它IFS=$oldIFS 你救了我,谢谢【参考方案3】:

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

【讨论】:

你可以做for word in $sentence//;/$'\n'(省略第二个作业)。要仅在换行符上循环,您可以执行 echo $sentence//;/$'\n' | while read elem; do echo "$elem"; done 之类的操作。【参考方案4】:

如果您不想弄乱 IFS(可能是为了循环内的代码),这可能会有所帮助。

如果知道您的字符串不会有空格,您可以用空格替换 ';' 并使用 for/in 构造:

#local str
for str in $STR//;/  ; do 
   echo "+ \"$str\""
done

但是如果您可能有空格,那么对于这种方法,您将需要使用临时变量来保存“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

【讨论】:

为什么没有评论却投了反对票?你应该证明这一点...... 我使用第一种方法,使用 $STR//;/ 语法。但是我现在遇到了一个问题,如果我传递一个没有分隔符的字符串,它会给出一个错误:“错误替换”。我想将这样的字符串视为具有一个元素的数组。您对解决这个问题有什么建议吗?【参考方案5】:
sentence="one;two;three"
a="$sentence;"
while [ -n "$a" ]
do
    echo $a%%;*
    a=$a#*;
done

【讨论】:

以上是关于linux shell脚本:拆分字符串,将它们放在一个数组中然后循环它们[重复]的主要内容,如果未能解决你的问题,请参考以下文章

(shell脚本)特殊分隔符文本文件导入MongoDB

Linux shell编程:shell语法

还不懂shell脚本核心?这一篇就够了。

Linux编程 20 shell编程(shell脚本创建,echo显示信息)

linux的shell编程中如何将一段命令的结果封装成一个变量?

如何避免作为 sql 查询输出的一部分返回的字符串值被拆分为 bash/shell 脚本中数组中的不同字段