如何在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选项。