Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中编写for循环_Bash_For Loop_Iterator - Fatal编程技术网

如何在bash中编写for循环

如何在bash中编写for循环,bash,for-loop,iterator,Bash,For Loop,Iterator,我正在寻找基本的循环,如: for(int i = 0; i < MAX; i++) { doSomething(i); } for(int i=0;i

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

for(int i = 0; i < MAX; i++) {
  doSomething(i);
}
for(int i=0;i
但是为了狂欢

来自:

((i=0;i;做回显“$i”;完成
尝试
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 w in word1 word2 word3
do
  doSomething($w)
done
您可能希望迭代一些数字,因此可以使用
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

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

我一直在使用这些列表的变体来处理文件

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


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

如果您只对bash感兴趣,上面介绍的“for(…)”解决方案是最好的,但是如果您想要兼容POSIX SH的、可以在所有Unice上工作的东西,则必须使用“expr”和“while”,这是因为“(())”或“seq”或“i=i+1”在各种Shell中都不是那么容易携带

我通常喜欢在标准for循环中使用一个轻微的变体。我经常使用它在一系列远程主机上运行命令。我利用bash的大括号扩展创建for循环,从而可以创建非数值for循环

例如:

我想在前端主机1-5和后端主机1-3上运行正常运行时间命令:

% 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等)。但是,双句点语法是Bash3.0的一个新特性;早期版本不支持此功能。

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

for i in {1..10} ; do ... ; done
..避免产生外部程序来扩展序列(如
seq 1 10

当然,这与(())解决方案的
存在相同的问题,与bash甚至特定版本(如果这对您很重要的话)相关联/bin/bash
做什么{
回显值=${1}
}
最大值=4

for((i=0;i)答案很好,但您可能希望包含for((i=0;我想你的意思是-execdir选项用于find与此相关,如果$host var是一个空行怎么办?它仍然会触发ssh。那么,我该如何避免呢?在我的情况下,我正在做一些不同的事情,所以你的回答会帮助我。我正在尝试检查Gmail中的新消息,如果发现,发送一条from和subject的短信。我的问题是l标记为“连接两个Bash命令”如果你想读的话。我不相信你会得到一个空的$host变量。这是因为上面的例子使用了大括号扩展。for循环显式地将$host变量设置为值:frontend1.mycompany.com frontend2.mycompany.com..backend1.mycompany.com,但是如果你能找到一种方法让它有一个空值,我很想知道。如果有问题,您可以在条件测试中执行ssh。我以前没有注意到,但在前面的一个答案中显示了类似的语法。这里的独特之处是使用了大括号,而不是典型的
do
/
done
对。这里指定的范围可能重复包括在内。我的意思是,您将看到整个范围(1到10)打印到控制台。如果我们有一个变量,如
ArrayLength=${#array[@]}
如何在这里使用它而不是
max
for d in $(find $somepath -type d)
do
  doSomething($d)
done
% for host in {frontend{1..5},backend{1..3}}.mycompany.com
    do ssh $host "echo -n $host; uptime"
  done
for i in {1..10} ; do ... ; done
#! /bin/bash

function do_something {
   echo value=${1}
}

MAX=4
for (( i=0; i<MAX; i++ )) ; {
   do_something ${i}
}
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'