一.流程控制语句
1.if语句
1.1 语法结构
if 语句语法格式:
if [ condition ];then
command1
command2
...
fi
# 也可以用下面这种方式
[ 条件 ] && command
if else 语法格式:
if [ condition ];then
command1
else
command2
fi
# 也可以用下面这种方式
[ 条件 ] && command1 || command2
if else-if else 语法格式:
if [ condition1 ];then
command1
elif [ condition2 ];then
command2
else
command3
fi
1.2 案例
1) 判断当前用户是否为root。
#!/bin/bash
if [ `id -u` -eq 0 ];then
echo "the user is root"
else
echo "the user is not root"
fi
2) 判断脚本后输入的ip能否ping通。
#!/bin/bash
ip=$*
if [ -z $ip ];then
echo "please input correct ip"
exit
else
ping -c1 $ip &>/dev/null &&{
echo "$ip can ping"
}||{
echo "$ip can not ping"
exit
}
fi
3) 判断脚本后输入的软件是否安装 未安装则安装。
#!/bin/bash
read -p "please input the software name: " name
rpm -q $name &>/dev/null
if [ $? -eq 0 ];then
echo "the $name is installed"
else
echo "the $name is not installed"
dnf install $name -y
if [ $? -eq 0 ];then
echo "the $name now is installed"
else
echo "sorry,the $name installed failed"
fi
fi
4) 判断当前内核主版本是否为2,次版本是否大于等于6
#!/bin/bash
kernel=`uname -r`
var1=`echo $kernel|cut -d. -f1`
var2=`echo $kernel|cut -d. -f2`
test $var1 -eq 2 -a $var2 -ge 6 && echo $kernel || echo "当前内核版本不符合要求"
或者
[ $var1 -eq 2 -a $var2 -ge 6 ] && echo $kernel || echo "当前内核版本不符合要求"
或者
[[ $var1 -eq 2 && $var2 -ge 6 ]] && echo $kernel || echo "当前内核版本不符合要求"
#!/bin/bash
if [ $master_version -eq 2 ];then
if [ $slave_version -ge 6 ];then
echo $full_version
fi
fi
2.多分支case语句
2.1 语法结构
case var in # 定义变量;var代表是变量名
pattern 1) # 模式1;用 | 分割多个模式,相当于or
command1 # 需要执行的语句
;; # 两个分号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
*) # default,不满足以上模式,默认执行*)后的语句
command4
;;
esac # esac表示case语句结束
2.2 案例
1) 传入start、stop、reload时分别执行相应命令。
#!/bin/bash
case $1 in
start|S)
echo "service is running...."
;;
stop|T)
echo "service is stoped..."
;;
reload|R)
echo "service is restart..."
;;
*)
echo "请输入你要的动作"
;;
esac
2) 模拟一个多任务维护界面。
#!/bin/bash
#打印菜单
menu(){
cat <<-END
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
END
}
menu
while true
do
read -p "请输入你的操作[h for help]:" var1
case $var1 in
h)
menu
;;
f)
read -p "请输入你要查看的设备名字[/dev/sdb]:" var2
case $var2 in
/dev/sda)
fdisk -l /dev/sda
;;
/dev/sdb)
fdisk -l /dev/sdb
;;
esac
;;
d)
lsblk
;;
m)
free -m
;;
u)
uptime
;;
q)
exit
;;
esac
done
二.循环语句
1.for循环
1.1 语法结构
- 列表循环
for variable in {list}
do
command
command
…
done
或者
for variable in a b c
do
command
command
done
for var in {1..10};do echo $var;done
for var in 1 2 3 4 5;do echo $var;done
for var in `seq 10`;do echo $var;done
for var in $(seq 10);do echo $var;done
for var in {0..10..2};do echo $var;done
for var in {2..10..2};do echo $var;done
for var in {10..1};do echo $var;done
for var in {10..1..-2};do echo $var;done
for var in `seq 10 -2 1`;do echo $var;done
- 不带列表循环
for variable
do
command
command
…
done
- 类C风格循环
for(( 初始值;循环控制条件;变量变化 ))
do
command
command
…
done
1.2 案例
1) 计算1-100内的奇数和
#!/bin/bash
sum=0
for i in {1..100..2}
do
let sum=$sum+$i
done
echo $sum
2) 计算阶乘
#!/bin/bash
read -p "Num:" num
result=1
for i in `seq $num`
do
result=$[ $result * $i ]
done
echo "The result is:" $result
3) 批量新建用户stu1~stu5
#!/bin/bash
for count in {1..5}
do
username="stu$count"
id $username &> /dev/null
if [ $? -eq 0];then
echo "user %username exists"
else
useradd -d /rhome $username
echo "user $username create success"
echo 123 | passwd --stdin $username
fi
done
2.while循环
2.1 语法结构
条件为真就进入循环;条件为假就退出循环
while conditon
do
command...
done
2.2 案例
1) 计算1-50的偶数和
#!/bin/bash
sum=0
i=2
while [ $i -le 50 ]
do
let sum=sum+i
let i+=2
done
echo "1-50的偶数和为:$sum"
2) 输入的数值进行比较判断
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品的价格为0-999之间,猜猜看是多少?"
while true
do
read -p "请输入您猜的价格:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您猜对了,实际价格是 $PRICE"
echo "您总共猜了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了"
else
echo "太低了"
fi
done
3.until循环
3.1 语法结构
条件为假就进入循环;条件为真就退出循环
until condition
do
command
command
...
done
3.2 案例
1) 打印数字1-9
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
2) 批量创建10个用户
要求:stu1—stu5用户的UID分别为1001—1005;stu6~stu10用户的家目录分别在/rhome/stu6—/rhome/stu10
#!/bin/bash
i=1
until [ $i -gt 10 ]
do
if [ $i -le 5 ];then
useradd -u $[1000+$i] stu$i && echo 123|passwd --stdin stu$i
else
[ ! -d /rhome ] && mkdir /rhome
useradd -d /rhome/stu$i stu$i && echo 123|passwd --stdin stu$i
fi
let i++
done
4.无限循环
# 格式1
while :
do
command
done
# 格式2
while true
do
command
done
# 格式3
for (( ; ; ))
5.循环控制
- continue:继续;表示循环体内下面的代码不执行,重新开始下一次循环
- break:打断;马上停止执行本次循环,执行循环体后面的代码
- exit:表示直接跳出程序
exit命令之后定义了返回值,那么这个脚本执行之后的返回值就是我们自己定义的返回值。可以通过查询$?这个变量,来查看返回值。如果exit之后没有定义返回值,脚本执行之后的返回值是执行exit 语句之前,最后执行的一条命令的返回值。
6.循环嵌套(打印九九乘法表)
for嵌套
#!/bin/bash
for ((y=1;y<=9;y++))
do
for ((x=1;x<=$y;x++))
do
echo -ne "$x*$y=$[$x*$y]\t"
done
echo
echo
done
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -ne "$j*$i=$[$i*$j]\t"
done
echo
echo
done
while嵌套
#!/bin/bash
y=1
while [ $y -le 9 ]
do
x=1
while [ $x -le $y ]
do
echo -ne "$x*$y=$[$x*$y]\t"
let x++
done
echo
echo
let y++
done
until嵌套
#!/bin/bash
y=1
until [ $y -gt 9 ]
do
x=1
until [ $x -gt $y ]
do
echo -ne "$x*$y=$[ $x*$y ]\t"
let x++
done
echo
echo
let y++
done