bash shell脚本中for循环

时间:2019-11-20 08:52:59  来源:igfitidea点击:

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