如何在bash中编写for循环

时间:2008-09-08 03:10:28

标签: bash iterator

我正在寻找基本循环:

for(int i = 0; i < MAX; i++) {
  doSomething(i);
}

但是对于bash。

9 个答案:

答案 0 :(得分:92)

来自this site

for i in $(seq 1 10);
do
    echo $i
done

答案 1 :(得分:58)

for ((i = 0 ; i < max ; i++ )); do echo "$i"; done

答案 2 :(得分:33)

bash for包含一个变量(迭代器)和一个迭代器将迭代的单词列表。

因此,如果你有一个有限的单词列表,只需将它们放在以下语法中:

for w in word1 word2 word3
do
  doSomething($w)
done

可能你想迭代一些数字,所以你可以使用seq命令为你生成一个数字列表:(例如从1到100)

seq 1 100

并在FOR循环中使用它:

for n in $(seq 1 100)
do
  doSomething($n)
done

请注意$(...)语法。这是一个bash行为,它允许您将输出从一个命令(在我们的例子中从seq)传递到另一个命令(for

当您必须遍历某个路径中的所有目录时,这非常有用,例如:

for d in $(find $somepath -type d)
do
  doSomething($d)
done

生成列表的可能性是无限的。

答案 3 :(得分:27)

Bash 3.0 + 可以使用以下语法:

for i in {1..10} ; do ... ; done

..避免产生外部程序来扩展序列(例如seq 1 10)。

当然,这与for(())解决方案存在同样的问题,与bash甚至特定版本相关(如果这对您很重要)。

答案 4 :(得分:13)

尝试bash内置帮助:


$ help for

for: for NAME [in WORDS ... ;] do COMMANDS; done
    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
    Equivalent to
        (( EXP1 ))
        while (( EXP2 )); do
            COMMANDS
            (( EXP3 ))
        done
    EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is
    omitted, it behaves as if it evaluates to 1.


答案 5 :(得分:4)

我通常喜欢在标准for循环上使用一个轻微的变体。我经常使用它在一系列远程主机上运行命令。我利用bash的大括号扩展来创建for循环,允许我创建非数字for循环。

示例:

我想在前端主机1-5和后端主机1-3上运行uptime命令:

% for host in {frontend{1..5},backend{1..3}}.mycompany.com
    do ssh $host "echo -n $host; uptime"
  done

我通常将其作为单行命令运行,在行的末尾使用分号,而不是上面的可读版本。关键的使用考虑因素是大括号允许您指定要插入到字符串中的多个值(例如pre {foo,bar} post prefor prefoopost,prebarpost)并允许使用双倍句点计数/序列(您可以使用a。 .z等)。但是,双周期语法是bash 3.0的一个新特性;早期版本不支持此功能。

答案 6 :(得分:4)

#! /bin/bash

function do_something {
   echo value=${1}
}

MAX=4
for (( i=0; i<MAX; i++ )) ; {
   do_something ${i}
}

这是一个可以在较旧的shell中使用的示例,同时对于大数量仍然有效:

Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'

但祝你在awk内做有用的事情:How do I use shell variables in an awk script?

答案 7 :(得分:1)

如果你只是在bash中表现出色,那么上面提到的“for((...))”解决方案是最好的,但是如果你想要符合POSIX SH标准的东西,那么你将不得不使用“ expr“和”while“,那是因为”(())“或”seq“或”i = i + 1“在各种shell中不可移植

答案 8 :(得分:0)

我一直使用这种变体来处理文件......

  

用于* .log中的文件;做回声“用东西:$ files”; echo“用更多东西:$ files”;完成的;

如果处理您感兴趣的文件列表,请查看文件 -execdir 选项。

相关问题