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

来源:互联网 发布:无间道刘建明知乎 编辑:程序博客网 时间:2024/05/18 13:42

一、条件判断

格式: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/bashtest=$(env | grep USER | cut -d ":" -f2)if ["$test" == "root"]     then           echo current user is rootfi
例程:判断分区使用率

#!/bin/bashtest=$(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/bashread -t 30 -p "please input num1:" num1read -t 30 -p "please input num2:" num2read -t 30 -p "please input operate:" opeif [ -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 11fiecho "$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/bashls  *.tar.gz > tar.logfor i in $(cat tar.log)    do        tar -zxf $i &> /dev/nulldonerm -rf tar.log 
例程:1加到100
#!/bin/bashs=0for ((i=1;i<=100;i=i+1))    do         s=$(($s+$i))doneecho "$s"

例程:批量添加用户

#!/bin/bashread -t 30 -p "please input user name" nameread -t 30 -p "please input the numbers of users" numread -t 30 -p "please input user passwd" passif [ -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          fifi
例程:批量删除普通用户

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

语法:

while  [ 条件判断式 ]

do
程序

done

6、until循环

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

until  [ 条件判断式 ]

do

程序

done

0 0