【发布时间】:2010-11-27 06:38:54
【问题描述】:
【问题讨论】:
-
这听起来像是家庭作业。无论如何,到目前为止您尝试过什么?发布一些表明您正在尝试的内容。
-
不是作业问题。只是不熟悉shell脚本。我一直在谷歌搜索,但没有找到我想要的东西。
标签: bash
【问题讨论】:
标签: bash
这是一个您可以使用的示例代码:
$ STR="String;1;2;3"
$ for EACH in `echo "$STR" | grep -o -e "[^;]*"`; do
echo "Found: \"$EACH\"";
done
grep -o -e "[^;]*" 将选择任何不是';'的东西,因此用';'分割字符串。
希望有所帮助。
【讨论】:
您可能可以跳过显式创建数组的步骤...
我喜欢使用的一个技巧是将字段间分隔符 (IFS) 设置为分隔符。这对于遍历空间或从许多 unix 命令的标准输出返回分隔结果特别方便。
以下是使用分号的示例(正如您在问题中提到的那样):
export IFS=";"
sentence="one;two;three"
for word in $sentence; do
echo "$word"
done
注意:在常规的 Bourne-shell 脚本设置和导出 IFS 将发生在两个单独的行 (IFS='x'; export IFS;)。
【讨论】:
oldIFS=$IFS,设置它IFS=';',做一些事情,然后恢复它IFS=$oldIFS。
这是 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 之类的操作。
如果您不想弄乱 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//;/ } 语法。但是我现在遇到了一个问题,如果我传递一个没有分隔符的字符串,它会给出一个错误:“错误替换”。我想将这样的字符串视为具有一个元素的数组。您对解决这个问题有什么建议吗?
sentence="one;two;three"
a="${sentence};"
while [ -n "${a}" ]
do
echo ${a%%;*}
a=${a#*;}
done
【讨论】: