shell编程之循环与判断语句

shell编程的循环结构主要有三种:for、while、until

shell编程的分支判断结构主要有两种:if、case

一、for循环:

for循环使用场景:主要用于已知循环次数的场景

进入循环条件:满足条件就进入循环

1.1 语法:

语法一:

for 变量 in 列表; do
循环体
done

语法二:

for (( expr1 ; expr2 ; expr3 )); do
循环体
done

1.2 使用实例:

实例1:计算100以内所有能被3整除的正整数的和,使用语法一

#!/bin/bash
#
declare -i SUM=0
for I in `seq 1 100` ;do
let YU=$I%3
if [ $YU -eq 0 ] ;then
let SUM=$SUM+$I
fi
done
echo "SUM is $SUM"

实例2:计算100以内所有正整数的和,使用语法二:

#!/bin/bash
#
declare -i SUM=0
for (( I=0;I<=100;I++ ));do
let SUM+=$I
done
echo SUM is $SUM

实例3:依次向/etc/passwd中的每个用户问好,并显示对方的shell

#!/bin/bash
#
LINES=`cat /etc/passwd | wc -l`
for I in `seq 1 $LINES`;do
USERNAME=`head -n $I /etc/passwd | tail -1 | cut -d: -f1`
USERSHELL=`head -n $I /etc/passwd | tail -1 | cut -d: -f7 | sed -r 's#/.*/([^/]+/?)#\1#g'`
echo "Hello,$USERNAME,your shell is $USERSHELL."
done

二、while循环:

while循环使用场景:适用于循环次数未知的场景,要有退出条件

进入循环条件:满足条件就进入循环

 2.1 语法:

while CONDITION; do
循环体
done

2.2 使用实例:

实例1:计算100以内所有正整数的和

#!/bin/bash
#
declare -i I=1
declare -i SUM=0
while [ $I -le 100 ]; do
let SUM+=$I
let I++
done
echo "SUM is $SUM"

实例2:转换用户输入的字符为大写,输入quit 或 q 就退出:

#!/bin/bash
#
read -p "Input something: " STRING
##注:read用于获取用户输入
while [ $STRING != 'quit' -a $STRING != 'q' ]; do
echo $STRING | tr 'a-z' 'A-Z'
read -p "Input something again: " STRING
done

2.3 while的特殊用法:

2.3.1 死循环:

while :;do
循环体
done

用处:循环时间次数不限,但在循环体中放置外部条件触发条件退出语句,当外部条件改变时,即退出。

实例:每分钟判断用户barlow是否登录,如果登录,就显示已经登录并退出循环

#!/bin/bash
#
while :;do

sleep 60
if who | grep "barlow" &> /dev/null;then
echo "User barlow is login!"
exit
fi
done

2.3.2 从文件中读取行作为条件:

while read LINE; do

statment

done < /PATH/TO/SOMEFILE

其等同于:

cat /PATH/TO/SOMEFILE | while read line;do
statment
done

实例:将ip.txt文件中的IP都加入iptables的drop规则

#!/bin/bash
#
while read LINE;do
/sbin/iptables -t filter -I INPUT -s $LINE -j DROP &>/dev/null
done < /root/sh/ip.txt

##此脚本可以改进后用于自动拒绝恶意攻击IP连接

三、until循环:

前面说到的for和while都是当条件满足时进入循环,而until则相反,是在条件不满足时进入循环。

3.1 语法:

until CONDITION; do
循环体
done

3.2 实例:计算100以内所有正整数的和

#!/bin/bash
#
declare -i SUM=0
declare -i I=1
until [ $I -gt 100 ];do
let SUM+=$I
let I++
done
echo "The SUM is $SUM"

四、if判断:

语法:

单分支if:

if CONDITION; then
statement
...
fi

双分支if:

if CONDITION; then
statement
...
else
statement
...
fi

多分支if:

if CONDITION1; then
statement
...
elif CONDITION2; then
statement
...
esle
statement
...
fi

if用法较简单,这里就不举实例了。

五、case判断:

5.1 语法:

case SWITCH in
value1)
statement
...
;;
value2)
statement
...
;;
*)
statement
...
;;
esac

注意:每个分支的结尾都需要两个分号结尾。

5.2 实例:

脚本用法:showlogged.sh -v -c -h|--help

showlogged.sh -v -c -h|--help
其中,-h选项只能单独使用,用于显示帮助信息;-c选项时,显示当前系统上登录的所有用户数;如果同时使用了-v选项(-v不能单独使用),则既显示同时登录的用户数,又显示登录的用户的相关信息

#!/bin/bash
#
declare -i SHOWNUM=0
declare -i SHOWUSERS=0

for I in `seq 1 $#`; do
if [ $# -gt 0 ]; then
case $1 in
-h|--help)
echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"
exit 0 ;;
-v|--verbose)
let SHOWUSERS=1
shift ;;
-c|--count)
let SHOWNUM=1
shift ;;
*)
echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"
exit 8 ;;
esac
fi
done

if [ $SHOWNUM -eq 1 ]; then
echo "Logged users: `who | wc -l`."
if [ $SHOWUSERS -eq 1 ]; then
echo "They are:"
who
fi
fi

更多实例请参考/etc/init.d/目录下的各类服务器启动脚本

猜你喜欢

转载自blog.csdn.net/ggxiaobai/article/details/59542061