我如何在bash中编写for循环

时间:2020-03-05 18:49:08  来源:igfitidea点击:

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

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

但是为了重击。

解决方案

回答

从此站点:

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

回答

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

回答

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

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

回答

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

for files in *.log; do echo "Do stuff with: $files"; echo "Do more stuff with: $files"; done;

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

回答

如果我们只对bash感兴趣,那么上面介绍的" for((... ...))"解决方案是最好的,但是如果我们希望POSIX SH兼容的东西可以在所有unice上使用,则必须使用" expr",并且" while",这是因为"(())"或者" seq"或者" i = i + 1"在各种shell中都不那么可移植

回答

我通常喜欢在标准的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的新功能。早期版本将不支持此功能。

回答

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

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

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

当然,这与for(())解决方案具有相同的问题,它与bash甚至是特定版本绑定在一起(如果这对我们而言很重要)。