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循环相当于遍历空格分隔的字符串。

