105

我正在寻找基本循环,例如:

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

但是对于 Bash。

4

9 回答 9

116

这个网站

for i in $(seq 1 10);
do
    echo $i
done
于 2008-09-08T03:11:07.960 回答
65
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
于 2008-09-08T03:13:17.813 回答
37

Bashfor由一个变量(迭代器)和一个迭代器将迭代的单词列表组成。

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

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 行为,它允许您将输出从一个命令(在我们的例子中是 from seq)传递到另一个命令(the for)。

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

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

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

于 2008-09-08T03:26:16.380 回答
32

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

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

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

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

于 2010-07-22T10:38:56.493 回答
14

尝试 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.
于 2008-09-08T03:14:12.540 回答
5
#! /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如何在 awk 脚本中使用 shell 变量?

于 2012-12-31T06:49:26.253 回答
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 导致 prefoopost、prebarpost)并允许使用双句点进行计数/序列(您可以使用 a. .z 等)。但是,双句点语法是 Bash 3.0 的新特性;早期版本将不支持此功能。

于 2008-09-27T10:31:58.580 回答
1

如果您只对 Bash 感兴趣,那么上面介绍的“for(( ... ))”解决方案是最好的,但是如果您想要适用于所有 Unices 的符合POSIX SH 的东西,则必须使用“expr " 和 "while",这是因为 "(())" 或 "seq" 或 "i=i+1" 在各种 shell 中不那么可移植。

于 2008-09-16T22:32:38.117 回答
0

我一直使用它的变体来处理文件......

对于 *.log 中的文件;do echo "用:$files 做事"; echo "用 $files 做更多事情"; 完毕;

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

于 2008-09-08T04:53:12.957 回答