bash shell脚本中for循环
如何使用for重复执行某些任务?
for循环是bash编程语言语句,它允许重复执行代码。 for循环被归类为迭代语句。
bash for循环语法
重复多次执行命令
for VARIABLE in 1 2 3 4 5 .. N do command1 command2 commandN done
或者 for循环读取和处理文件列表
for VARIABLE in file1 file2 file3 do command1 on $VARIABLE command2 commandN done
或者遍历命令
for OUTPUT in $(Linux或者Unix命令) do command1 on $OUTPUT command2 on $OUTPUT commandN done
bash for循环示例
#!/bin/bash for i in 1 2 3 4 5 do echo "count $i" done
最新的bash版本3.0+具有内置的设置范围支持:
#!/bin/bash for i in {1..5} do echo "Count $i " done
Bash v4.0 +已内置支持使用{START..END..INCREMENT}
语法设置步长值:
#!/bin/bash echo "Bash version ${BASH_VERSION}..." for i in {0..10..2} do echo "Count $i " done
使用seq命令创建循环
以前的bash还支持seq创建循环,并且现在还可以使用。
但建议您避免使用seq。
#!/bin/bash for i in $(seq 1 2 20) do echo "Count $i " done
带有三表达式的for循环语法
这种类型的for循环由初始化程序(EXP1),循环测试或条件(EXP2)和计数表达式/步骤(EXP3)组成。
for (( EXP1; EXP2; EXP3 )) do command1 command2 command3 done ## c风格的for循环 ## for (( initializer; condition; step )) do shell命令 done
示例:
#!/bin/bash for (( c=1; c<=5; c++ )) do echo "Welcome $c times" done
for死循环
使用空表达式可以创建for死循环,例如:
#!/bin/bash for (( ; ; )) do echo "死循环[ 按 CTRL+C 退出]" done
根据条件提取退出for循环
在for循环中,可以使用break语句提前退出。
语法:
for I in 1 2 3 4 5 do 语句1 语句2 if (提前退出条件) then break fi 语句3 done
示例:
在/etc/中遍历所有文件,当找到/etc/resolv.conf文件时,则退出for循环。
#!/bin/bash for file in /etc/* do if [ "${file}" == "/etc/resolv.conf" ] then dns=$(cat /etc/resolv.conf) echo "${dns}" break fi done
shell continue语句
continue语句用于提前结束FOR,WHILE或UNTIL循环的当前迭代。
开始下一个迭代。
for I in 1 2 3 4 5 do 语句1 语句2 if (判断条件) then continue 如果条件满足,则不执行语句3,重新开始新一轮的迭代 fi 语句3 done
下面的示例中,将备份所有文件,如果是.bak文件,则跳过。
#!/bin/bash FILES="$@" for f in $FILES do # 如果是.bak,则跳过不备份。 if [ -f ${f}.bak ] then echo "Skiping $f file..." continue # 重新开始下一个循环 fi /bin/cp $f $f.bak done
bash shell 循环遍历数组
可以使用for循环遍历元素数组:
servers=('javaserver', 'theitroad', 'siteonitorad') for server in "${servers[@]}" do echo "server: $server" done
bash shell 指定for循环范围
我们可以在循环中指定范围,如下所示:
for i in {START..END} do commands done ## 指定步长 ## for i in {START..END..STEP} do commands done
示例:
ping多台服务器
for i in 0{1..4} do h="theitroad${i}" ping -c 1 -q "$h" &>/dev/null if [ $? -eq 0 ] then echo "server $h alive" else echo "server $h dead or can not ping." fi done
bash shell脚本循环遍历字符串
我们可以通过遍历字符串列表(空格分隔)来安装软件包:
PKGS="php7-openssl-7.2.10-r0 php7-common-7.2.10-r0 php7-fpm-7.2.10-r0 php7-opcache-7.2.10-r0 php7-7.2.10-r0" for p in $PKGS do echo "Installing $p package" sudo apk add "$p" done
在for循环中使用命令代入
命令代入(Command substitution)是指执行shell命令并将其输出存储到变量。例如:
up=$(uptime) echo "Server uptime is $up"
for循环参数列表还可以是命令代入,语法如下所示:
for var in $(command) do print "$var" done
示例:
for f in $(ls /nas/*.pdf)
do
print "File $f"
done
命令行参数
命令行参数是发送给被调用程序的参数。
程序可以使用任意数量的命令行参数。
例如,我们将使用grep命令在/etc/passwd文件中搜索用户名:
$ grep 'Hyman' /etc/passwd
grep是实际命令的名称,当您在shell提示符下输入命令时,shell将执行此命令。
- grep要执行的命令的名称。
- 命令行上的其他所有内容都是该命令的参数。
for循环参数列表还可以包含命令行参数,如下所示:$@
展开后就是所有的参数:
script 文件
for i in $@ do echo "Script arg is $i" done
运行脚本:
./script one foo bar
那么$@
的值就是 one foo bar。
for循环相当于遍历空格分隔的字符串。