Shell基础(五):条件判断与流程控制

时间:2022-07-31 05:37:25

一、条件判断

格式:test  [选项]  file    

或者    [(空格)条件判断式(空格)]         注:不要忘记空格

1、按文件类型进行判断

选项:-d:判断文件是否存在,且是目录文件时为真

-e:判断文件是否存在,存在时为真

-f:判断文件是否为真,且为普通文件时为真

-b:判断文件是否存在,且为块设备文件时为真

-c:判断文件是否存在,且为字符设备时为真

-L:判断文件是否存在,且为符号链接文件时为真

-p:判断文件是否存在,且为管道文件时为真

-s:判断文件是否为非空,非空时为真

-S:判断套接字文件是否存在,存在时为真

例:[-e  filename]   执行命令后echo  $?查看若值为0说明执行正确,文件存在

[-e  filename]  &&  echo  yes  ||  echo no

2、按文件权限进行判断

-r:拥有读权限时为真

-w:拥有写权限时为真

-x:拥有执行权限时为真

-u:  有SUID权限时为真

-g:有SGID权限时为真

-k:有SBit权限时为真

3、两个文件间比较

文件1  -nt  文件2           判断文件1是否比文件2新,若新则为真

文件1  -ot  文件2           判断文件1是否比文件2旧,若旧则为真

文件1  -ef  文件2           判断文件1iNode节点号是否和文件2相同,(可用此判断硬链接)

4、两个整数间比较

整数1  -eq  整数2          判断是否相等

整数1  -ne  整数2          判断是否不相等

整数1  -gt  整数2           判断是否大于

整数1  -ge  整数2           判断是否大于等于

整数1  -lt  整数2             判断是否小于

整数1  -le  整数2            判断是否小于等于

5、字符串的判断

-z  字符串                       判断字符串是否为空

-n  字符串                       判断字符串是否为非空

字符串1  ==  字符串2      判断是否相等

字符串1  !=   字符串2       判断是否不等

例:[  -z  "$name"]  $$  echo yes  ||  echo no

6、多重条件判断

判断1  -a  判断2               逻辑与,1和2都为真最终结果才为真

判断1  -o  判断2               逻辑或,1和2有一个为真结果就为真

!判断                              逻辑非

二、流程控制

1、单分支if语句

if  [ 条件判断式 ];then

程序

fi

或者:if  [ 条件判断式 ]

then

程序

fi

例程:判断当前用户是root

#!/bin/bash
test=$(env | grep USER | cut -d ":" -f2)
if ["$test" == "root"]
then
echo current user is root
fi
例程:判断分区使用率

#!/bin/bash
test=$(df -h | grep /dev/sda5 | awk '{print $5}' | cut -d "%" -f1)
if [ $test -ge 80 ]
then
echo "sda5 is full"
fi

2、双分支if语句

if [ 条件判断语句 ]

then

程序

else

程序

fi
例程:判断手动输入的是不是目录文件

#! /bin/bash


read -t 30 -p "please input num1:" num1
read -t 30 -p "please input num2:" num2


read -t 30 -p "please input operate:" 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
                                        ans=$(($num1 + $num2))
                                elif [ "$ope" == '-' ]
                                        then
                                        ans=$(($num1 - $num2))
                                elif [ "$ope" == '*' ]
                                        then
                                        ans=$(($num1 * $num2))
                                elif [ "$ope" == '/' ]
                                        then
                                        ans=$(($num1 / $num2))
                                        else
                                        echo "error: input operate wrong"
                                        exit 9
                                fi
                        else
                                echo "error: input is not a num"
                                exit 10
                fi
        else
                echo "error: input num is null"
                exit 11


fi
echo "$num1" "$ope" "$num2" = $ans"

3、多分支case语句

case $变量名 in

“值1”)

若等于值1,程序

;;

“值2”)

若等于值2,程序

;;

*)

若都不等于,程序

;;

esac

4、for循环

语法一:

for   变量名   in  值1  值2  值3  ...

do

程序

done

语法二:

for  ((初始值;循环控制条件;变量变化))

do

程序

done

例程:批量解压缩文件

#!/bin/bash
ls *.tar.gz > tar.log
for i in $(cat tar.log)
do
tar -zxf $i &> /dev/null
done
rm -rf tar.log
例程:1加到100
#!/bin/bashs=0for ((i=1;i<=100;i=i+1))    do         s=$(($s+$i))doneecho "$s"

例程:批量添加用户

#!/bin/bash
read -t 30 -p "please input user name" name
read -t 30 -p "please input the numbers of users" num
read -t 30 -p "please input user passwd" pass
if [ -n "$name" -a -n "$num" -a -n "$pass" ]
then
y=$( echo $num | sed 's/[0-9]'//g )
if [ -z $y ]
then
for ((i=1;i<=$num;i=i+1))
do
/user/sbin/useradd $name$i $>/dev/null
echo $pass | /user/bin/passwd --stdin $name$i $>/dev/null
done
fi
fi
例程:批量删除普通用户

#!/bin/bash
for i in $(cat /etc/passwd | grep /bin/bash | grep -v root)
do
userdel $i
done
5、while循环

语法:

while  [ 条件判断式 ]

do
程序

done

6、until循环

语法: 是在条件不成立时执行

until  [ 条件判断式 ]

do

程序

done