shell作为一种脚本编程语言,同样包含循环、分支等其他程序控制结构,从而轻松完成更加复杂、强大的功能
循环语句
<1>for循环
for 条件
do
动作
done
循环方式:
<1> for 变量名 in 变量遍历列表
举例:
for NUM in {1..5}
for NUM in "1 2 3" "abc"
[root@server script]# vim for.sh
for NUM in "1 2 3" "abc"
do
echo $NUM
done[root@server script]# sh for.sh
1 2 3
abc
<2 >for ((a=1;a<=10;a++))
<3>for NUM in `seq 1 2 10` ##以命令的结果作为变量的便历列表
seq命令:不设置步长时默认步长为1
练习:
<1>编写脚本测试172.25.254网段中的主机网是否是通的
#!/bin/bash
for ((a=1;a<255;a++))
do
ping -w1 -c1 172.25.254.$a &> /dev/null && echo "172.25.254.$a is up" || echo "172.25.254.$a is down"
done
<2>编写脚本实现倒计时10秒
#!/bin/bash
for ((a=10;a>=0;a--))
do
echo -n " TIME $a "
echo -ne "\r"
sleep 1
done
<2>编写脚本实现从输入的分钟数和秒数开始进行时间的倒计
(1)将分钟转化为秒数实现
#!/bin/bash
read -p "请输入分钟数和秒数: " i j
t=i*60+j
for((t;t>0;t--))
do
m=$[t/60]
s=$[t%60]
echo -n " TIME $m:$s "
echo -ne "\r"
sleep 1
done
(2)双循环实现
#!/bin/bash
read -p "请输入分钟数与秒数:" i j
for ((m=$i;m>=0;m--))
do
for ((s=$j;s>=0 && s<60;s-- ))
do
echo -n " TIME $m:$s "
echo -ne "\r"
sleep 1
if [ $s == 0 ];then
j=59
fi
done
done
<2>编写脚本实现打印9*9乘法表
##打印9*9乘法表
#1*1=1
#2*1=2 2*2=4
#3*1=3 3*2=6 3*3=9
.....
#!/bin/bash
#for i in $(seq 9)
for ((i=1;i<10;i++))
do
#for j in $(seq $i)
for ((j=1;j<=i;j++))
do
echo -ne "$i*$j=$[$i*$j]\t"
done
echo -e "\n" ## \r (return)就是回到本行行首,这就会把这一行以前的输出覆盖掉# echo -e "\r" ## \n (newline)是回车+换行 把光标 先移到 行首 然后换到下一行 也就是下一行的行首
done
程序运行结果:
<2>while循环
for语句适用于列表对象无规律,且列表来源以固定的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定的条件重复操作等情况,则更适合于while循环语句
只要while后面的条件满足,就一直执行do里面的代码块。
while 条件
do
动作
done
练习:
编写一个脚本,使用循环语句新建用户westos{1..20},且设置这些用户的密码都为"123456"
#!/bin/bash
PREFIX="westos"
i=1
while [ $i -le 20 ]
do
useradd ${PREFIX}$i &> /dev/null
echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
((i++))
done
执行脚本的结果:
条件语句
<1>if语句
和C语言类似,在Shell中用if、then、elif、else、fi这⼏条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell命令组成的
if [ 条件判断 ];then ##条件判断和方括号[ ]之间必须有空格,否则会有语法错误。
动作1
elif
动作2
elif
动作3
else
动作4
fi
练习:
<1>
#!/bin/bash
user=student
if grep $user /etc/passwd;then
echo "The files for user $user are:"
ls -a /home/$user
else
echo "$user not exist!"
fi
脚本运行结果:
<2>
#!/bin/bash
if [ -z $1 ];then
echo "Please input a user"
elif [ "$1" == "harry" ];then
echo "Welcom $1"
elif [ "$1" == "Jimmy" ];then
echo "Welcom $1"
elif [ "$1" == "tommy" ];then
echo "Welcom $1"
else
echo "You are not allowed"
fi
执行脚本测试:
<2>case语句
case语句是用来实现多个if..else的功能的,case会对字符串进行匹配,是从第一个模式开始的,如果有一个模式已经匹配成功的话,其他的模式就不会再进行匹配了。
case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。与多分支if语句相识,只是if语句需要判断多个不同的条件,而case只是判断一个变量的不同取值
case语句的基本用法,记住每一个匹配后边都有双分号,代表本模式的结束和下一个模式的开始,再进行通配
单个匹配模式
case
"$input"
in
yes
)
echo
"yes"
;;
y* )
echo
"y*"
;;
y )
echo
"y"
;;
no )
echo
"no"
;;
n )
echo
"n"
;;
* )
echo
"default"
;;
esac
练习:
#!/bin/bash
case $1 in
student)
echo "Welcome,student"
;;
westos)
echo "Welcome,westos"
;;
linux)
echo "Welcome,linux"
;;
*)
echo "Sorry!"
;;
esac
合并匹配模式,case的匹配只能匹配一条,想要做到匹配多个结果使用如下的方式
case
"$input"
in
y* | Y* )
echo
"yes"
;;
n* | N* )
echo
"no"
;;
* )
echo
"default"
;;
esac
练习:
#!/bin/bash
case $1 in
student|kiosk|linux|westos)
echo "Welcome,$1"
;;
*)
echo "Sorry!"
;;
esac
练习:
编写脚本,实现交互式执行对应的程序功能
A 显示主机IP
B 显示磁盘剩余空间
C 显示系统运行时间
Q 退出系统
脚本编写如下:
#!/bin/bash
while true
do
echo -e "
\033[31m A 显示主机ip地址 \033[0m
\033[32m B 显示磁盘剩余空间 \033[0m
\033[33m C 显示系统运行时间 \033[0m
\033[34m Q 退出系统 \033[0m
"
read -p "请输入选项:" char
case $char in
a|A)
ifconfig eth0 | grep "inet " | awk '{print "本机ip为:"$2}'
;;
b|B)
df -h | awk 'NR==2{print "剩余空间大小为:"$2}'
;;
c|C)
uptime | awk '{print $3}' |awk -F, '{print $1}' | awk -F: '{print "系统已经>运行了"$1"小时"$2"分钟"}'
;;
q|Q)
exit 0
;;
esac
done
运行脚本的结果如下所示: