如何在bash中编写for循环

我正在寻找像下面这样的基本循环:

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

但为bash。

请参阅: 本网站

  for i in $(seq 1 10); do echo $i done 
 for ((i = 0 ; i < max ; i++ )); do echo "$i"; done 

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

所以,如果你有一个有限的单词列表,只要把它们放在下面的语法中:

 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

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

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

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

Bash 3.0+可以使用这个语法:

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

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

当然,这与for(())解决scheme有相同的问题,绑定到bash甚至是一个特定的版本(如果这对你很重要)。

尝试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. 

我通常喜欢在循环标准中使用一个轻微的变体。 我经常用它来在一系列远程主机上运行一个命令。 我利用bash的大括号扩展来创buildfor循环,使我可以创build非数字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 

我通常运行这个作为单行命令在行的末尾分号,而不是上面更可读的版本。 关键的使用考虑因素是,大括号允许你指定多个值插入到一个string(例如pre {foo,bar} post preopopost,prebarpost中的结果),并允许使用double句点计数/序列(可以使用。 .z等)。 然而,双句点语法是bash 3.0的一个新特性; 较早的版本将不支持这一点。

 #! /bin/bash function do_something { echo value=${1} } MAX=4 for (( i=0; i<MAX; i++ )) ; { do_something ${i} } 

如果你只是在bash中进行了干涉,上面提到的“for((…))”解决scheme是最好的,但是如果你想要POSIX SH兼容,可以在所有unices上工作,你必须使用“expr” “while”,这是因为“(())”或“seq”或“i = i + 1”在各种shell

我一直使用这种变化来处理文件…

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

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