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脚本:拆分字符串,将它们放在一个数组中然后循环它们[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Linux编程 20 shell编程(shell脚本创建,echo显示信息)