带有for循环的Shell脚本

时间:2014-08-13 14:14:49

标签: shell for-loop sh

我们如何在shell脚本中的for循环中放置一个列表? 我的意思是想象我们有1000个字符串:string1.yaml ... string1000.yaml,我们想写一个列表 LL = {string1.yaml ... string1000.yaml} 并在剧本中说:

for i in LL
do
...
done

特别是如果一个接一个地写一个

,就会出现断线问题
for i in  string1.yaml  ... string1000.yaml

非常感谢

2 个答案:

答案 0 :(得分:2)

在POSIX shell中,并不是一个好方法。天真的方法:

LL="a b c d e"
for i in $LL; do
 ...
done

依赖于列表中没有元素包含分隔符(此处为空格)的事实。如果您提前知道列表中的字符,则可以使用IFS。例如,如果您知道没有项目包含逗号,则可以使用

LL="a,b c,d,e"   # Yes, the second item is "b c"
# This is not a perfect way to backup IFS; I'm ignoring the corner
# case of what happens if IFS is currently unset.
OLDIFS=$IFS
IFS=,
for i in $LL; do
   ...
done
IFS=$OLDIFS

如果您实际使用的是bash或其他更现代的shell,则可以使用专门针对此类问题引入的数组。数组本质上是第二级引用,因此您不需要自己提供明确的分隔符。

LL=(a "b c" d e)   # Four items, the second item contains a space
for i in "${LL[@}}"; do
  ...
done

答案 1 :(得分:0)

如果您要处理大量项目,可能需要将它们放在单独的文件中,并按以下方式阅读:

$ cat strings.txt
string1.yaml
[...]
string1000.yaml
$ cat loop.sh
while IFS= read -r line
do
    [...] "$line"
done < strings.txt

这样可以避免使用数据混乱代码,并且符合POSIX标准而不会过于复杂。