【问题标题】:How do I write a 'for' loop in Bash?如何在 Bash 中编写“for”循环?
【发布时间】:2010-09-08 03:01:09
【问题描述】:

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

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

但对于 Bash。

【问题讨论】:

标签: bash for-loop iterator


【解决方案1】:

来自this site

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

【讨论】:

  • 值得一提的是,这里指定的范围是包含。我的意思是,您将看到整个范围(1 到 10)打印到控制台。
【解决方案2】:
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done

【讨论】:

  • 如果我们有一个像ArrayLength=${#array[@]} 这样的变量,我们如何在这里使用它而不是max
【解决方案3】:

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 ((i=0; i
【解决方案4】:

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

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

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:
      #! /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?内部做有用的事情

      【讨论】:

      • 我之前没有注意到,但在较早的答案之一中显示了类似的语法。这里的独特之处在于使用花括号而不是典型的 do/done 对。
      【解决方案7】:

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

      【讨论】:

      • 与此相关,如果 $host var 意外是空行怎么办?它仍然会触发 ssh。那么,我该如何避免呢?就我而言,我正在做一些不同的事情,所以你的回答会对我有所帮助。我正在尝试检查 Gmail 是否有新邮件,如果找到,请发送来自和主题的 SMS。如果您想阅读,我的问题被标记为“连接两个 Bash 命令”。
      • 我不相信你会得到一个空的 $host 变量。这是因为上面的示例使用了大括号扩展。 for 循环将 $host 变量显式设置为值:frontend1.mycompany.com frontend2.mycompany.com。 . backend1.mycompany.com 但是,如果您看到它具有空值的方法;我很想知道。如果有问题,您可以在条件测试中执行 ssh。
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

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

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

        【讨论】:

        • 我认为您的意思是查找的 -execdir 选项
        猜你喜欢
        • 1970-01-01
        • 2021-07-10
        • 2022-01-27
        • 1970-01-01
        • 2014-09-03
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多