条件判断与流程控制
一、条件判断式语句
1.按照文件类型判断
(1)
常用:
-d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)
(2)两种判断格式
test -e /root/install.log
[-e /root/install.log]
注:可以再次使用:
预定义变量$?
echo $?
返回0表示上一条命令成功执行
返回非0表示上一条命令未成功执行
上述方式不能直观的表现想要的结果,可以使用
[-d /root] && echo "yes" || echo "no"
2.按照文件权限进行判断
常用:
-r文件 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w文件 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x文件 断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
例子:
[-w /root/install.log]
只要该文件拥有该权限,不会判断是所属者或者所属组是否拥有。
3.两个文件之间进行比较
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法
4.两个整数之间的比较
5.字符串的判断
eg:
[-z $name] && echo yes || echo no
aa=11
bb=22
["$aa" == "$bb"]
# 比较字符串,注意,这里的$aa 和 $bb加了双引号
6.多重条件判断
二、单分支if语句
1.
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
单分支条件语句需要注意几个点:
if语句使用fi结尾,和一般语言使用大括号结尾不同
[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
2.例子1.判断登陆的用户是否root
eg:
#!/bin/bash
test=$(env | grep "USER" | cut -d "=" -f 2)
if [ "$test" == "root" ]
then
echo "Current user is root."
fi
注:then后面跟符合条件之后执行的程序,可以放在[]之后,用";“分割。也可以换行写入,就不需要”;"了
3.例子2:判断分区使用率
#!/bin/bash
rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)
if [ "$rate" -ge "80" ]
then
echo "/dev/sda1 is full"
fi
三、双分支if条件语句
1.
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
2.例子3 输入一个字符串,判断是不是目录
read -t 30 -p "please input a dir:" dir
# 等待30秒,输出提示信息
if [-d "$dir"]
then
echo "yes"
else
echo "no"
fi
3.例子4 判断Apache服务是否正常启用
ps aux | grep httpd | grep -v grep #查询httpd是否启动
注:ps aux:查看系统中所有正在运行的进程
grep -v grep:取反,取出不包含grep的行
脚本:
#!/bin/bash
test=$(ps aux | grep httpd | grep -v grep)
if [ -n "$test" ]
then
echo "httpd is ok!"
else
/etc/rc.d/init.d/httpd start
echo "restart httpd !!"
fi
注意:脚本名不应该与服务名相同
四、多分支if条件语句
1.
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件...
else
当所有条件都不成立时,最后执行此程序‘
fi
2.例子5 简单计算器
#!/bin/bash
read -t 30 -p "Please input num1:" num1
read -t 30 -p "Please input num2:" num2
read -t 30 -p "Please input operator:" ope
if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
then
test1=$(echo $num1 | sed 's/[0-9]//g')
test2=$(echo $num2 | sed 's/[0-9]//g')
if [ -z "$test1" -a -z "$test2" ]
then
if [ "$ope" == '+' ]
then
result=$(($num1+$num2))
elif [ "$ope" == '-' ]
then
result=$(($num1-$num2))
elif [ "$ope" == '/' ]
then
result=$(($num1 / $num2))
elif [ "$ope" == '*' ]
then
result=$(($num1*num2))
else
echo "Error: the input operator is worng, please input +-*/"
exit 111
fi
else
echo "Error: Please input numbers!"
exit 222
fi
echo "$num1 $ope $num2 is $result"
else
echo "Error: You input null value!"
exit 333
fi
3.例子6 判断用户输入的是什么文件
#!/bin/bash
read -t 30 -p "Please input a file name:" file
if [ -z "$file" ]
then
echo "Error, please input a file name!"
exit 11
elif [ ! -e "$file" ]
then
echo "Your input is not a file name!"
exit 22
elif [ -f "$file" ]
then
echo "$file is a regular file!"
elif [ -d "$file" ]
then
echo "$file is a directory !"
else
echo "$file is another file!"
fi
五、多分支case语句
1.
case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;; #注意分号(;)一定要加
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支.…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
2.例子7
#!/bin/bash
read -t 30 -p "please input yes/no:" cho
case "$cho" in
"yes")
echo "yes"
;;
"no")
echo "no"
;;
*)
echo "please input yes/no again!!!"
;;
esac
六、for循环
1.语法一
for 变量 in 值1 值2 值3...
do
程序
done
eg:
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
2.例子8 for循环批量解压压缩包
##!/bin/bash
cd /root/test
ls *.tar.gz > ls.log #(>覆盖)
ls *.tgz >> ls.log #(>>追加)
for i in $( cat ls.log )
do
tar -czf $i &> /dev/null
#把执行过程中所有输出信息丢到回收站,不显示在屏幕上
done
rm -rf ls.log
3.语法二
for ((初始值;循环控制条件;变量变化))
do
程序
done
eg:1到100的累加
##!/bin/bash
s=0
for (( i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
echo "sum is: $s"
4.例子9 批量添加删除指定数量的用户
#!/bin/bash
#批量添加指定数量的用户实例
read -t 30 -p "input user name:" name
read -t 30 -p "input password:" pass
read -t 30 -p "input user number:" num
#检查输入内容是否为非空
if [ -n "$name" -a -n "$pass" -a -n "$num" ]
then
#检查输入的用户数量是否为纯数字
chknum=$( echo "$num" | sed 's/[0-9]//g' )
if [ -z "$chknum" ]
then
for (( i=1;i<="$num";i=i+1 ))
do
#添加用户
/usr/sbin/useradd $name$i &>/dev/null
#添加用户密码,passwd 的--stdin参数是非交互输入,直接传入密码,不需要第二次确认
echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
echo "add $i complete"
done
else
echo "the num must be number"
fi
else
echo "input can not be null,please input"
fi
批量删除用户实例
cat /etc/passwd | grep /bin/bash | grep -v /root | cut -d “:” -f 1 #找出/etc/passwd下的普通用户
#!/bin/bash
#批量删除用户
user=$(cat /etc/passwd | grep "/bin/bash" | grep -v root | cut -d ":" -f 1)
for i in $user
do
#删除用户,-r参数是删除用户家目录
/usr/sbin/userdel -r $i
done
七、while循环和until循环
1.while循环
while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。
while[ 条件判断式 ]
do
程序
done
2.例子10
#!/bin/bash
#从1加到100
i=1
s=0
while [ $i -le 100 ]
#如果变量i的值小于等于100,则执行循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is:$s"
3.until循环
until循环和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序,一旦循环条件成立,则终止循环
格式:
until [ 条件判断式 ]
do
程序
done
4。例子11
#!/bin/bash
#until循环1加到100
sum=0
i=1
until [ $i -gt 100 ]
do
sum=$(( $sum+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $sum"