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 :;dosleep 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=0for 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
doneif [ $SHOWNUM -eq 1 ]; then
echo "Logged users: `who | wc -l`."
if [ $SHOWUSERS -eq 1 ]; then
echo "They are:"
who
fi
fi