Shell 编程----条件语句

Shell 编程----条件语句

一:条件测试

1.1:文件测试与整数测试

1.1.1:文件测试

  • test 命令

    测试表达式是否成立,若成立返回0,否则返回其他数值.

    格式1: [test 条件表达式]

    格式2: [ 条件表达式 ]

    注意:格式2中表达式与中括号之间要有空格,否则语法错误.

  • 文件测试

    [ 操作符 文件或目录 ]

    常用的测试操作符

    常见的测试操作符解释
    -d测试是否为目录(directory)
    -e测试目录或文件是否存在(Exist)
    -f测试是否为文件(File)
    -r测试当前用户是否有权限读取(Read)
    -w测试当前用户是否有权限写入(Write)
    -x测试当前用户是否有权限执行(eXcute)

    注意: 测试文件推荐用绝对路径

    [root@shell ~]# touch abc.txt
    [root@shell ~]# test -f abc.txt
    [root@shell ~]# echo $?
    0
    [root@shell ~]# test -d abc.txt 
    [root@shell ~]# echo $?
    1
    [root@shell ~]# [-d abc.txt]
    bash: [-d: 未找到命令...
    '注意中括号要有空格,要不然报错'
    [root@shell ~]# [ -d abc.txt ]
    [root@shell ~]# echo $?
    1
    [root@shell ~]# [ -f abc.txt ]
    [root@shell ~]# echo $?
    0
    
    
    [root@shell ~]# [ -d /dev/cdrom ]
    [root@shell ~]# echo $?
    1
    [root@shell ~]# [ -f /dev/cdrom ]
    [root@shell ~]# echo $?
    1
    [root@shell ~]# [ -e /dev/cdrom ]
    [root@shell ~]# echo $?
    0
    [root@shell ~]# [ -e /dev/cdrom ]&& echo "yes"
    yes
    [root@shell ~]# [ -d /dev/cdrom ]&& echo "yes"
    [root@shell ~]# [ -f /dev/cdrom ]&& echo "yes"
    '注意&& 前面成立继续执行后面内容
    '&&前面不成立不执行后面的内容'
    

1.1.2: 整数值比较

  • [ 整数1 操作符 整数2 ]

  • 操作符解释
    -eq等于(Equal)
    -ne不等于(Not Equal)
    -gt大于(Greater Than)
    -lt小于(Lesser Than)
    -le小于或等于(Lesser or Equal
    -ge大于或等于(Greater or Equal)
  • [root@shell ~]# [ 55 -gt 80 ] && echo "yes"
    [root@shell ~]# [ 80 = 80 ] && echo "yes"
    yes
    [root@shell ~]# [ 80 == 80 ] && echo "yes"
    yes
    [root@shell ~]# 
    [root@shell ~]# [ 'zhangsan' == 'zhangsan' ] && echo yes
    yes
    [root@shell ~]# [ 'zhangsan' -eq 'zhangsan' ] && echo yes
    bash: [: zhangsan: 期待整数表达式
    [root@shell ~]# [ 'zhangsan' == 'zhang' ] && echo yes
    [root@shell ~]# [ ! 'zhangsan' == 'zhang' ] && echo 'yes'
    
    [root@shell ~]# who | wc -l
    3
    [root@shell ~]# [ $(who | wc -l) -gt 5 ] && echo "Too many"
    [root@shell ~]# [ $(who | wc -l) -gt 5 ] && echo ">=1"
    [root@shell ~]# echo $?
    1
    [root@shell ~]# [ $(who | wc -l) -gt 2 ] && echo ">=2"
    >=2
    
    [root@shell ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:           3771         756        2219          57         794        2649
    Swap:          8191           0        8191
    [root@shell ~]# FreeCC=$(free -m |grep "Mem:"| awk '{print $6}')
    [root@shell ~]# echo $FreeCC
    794
    [root@shell ~]# [ $FreeCC -lt 1024 ] && echo ${FreeCC} MB
    794 MB
    '注意这里不能用$( ),这表示括号里面是命令,不能是变量,${}里面可以是变量'
    '一般情况下,$var${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围,主要用来变量替换'
    

1.2:字符串测试与逻辑测试

1.2.1: 字符串的比较

  • 常用的格式
    格式一:[ 字符串1 = 字符串2 ]
    [ 字符串1 != 字符串2 ]
    格式二:[ -z 字符串 ]

    常用的测试操作符解释
    =第一个字符串与第二个字符串内容相同
    !=第一个字符串与第二个字符串内容不同,!号表示相反的意思
    -z检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串
[root@shell ~]# echo $LANG
zh_CN.UTF-8
[root@shell ~]# [ $LANG = "en_us" ] && echo "yes"
[root@shell ~]# [ ! $LANG = "en_us" ] && echo "yes"
yes
[root@shell ~]# [ "男" = "男" ] && echo 'yes'
yes
[root@shell ~]# [ ! "男" = "男" ] && echo 'yes'

[root@shell ~]# [ "男" != "男" ] && echo 'yes'
[root@shell ~]# [ "男" != "女" ] && echo 'yes'
yes
[root@shell ~]# [ "男" = "女" ] && echo 'yes'
[root@shell ~]# 

[root@shell ~]# vi test02.sh 

#!/bin/bash
[ ! -e /opt/share ] && echo "不存在" || mkdir /opt/share && echo "创建成功"
[root@shell ~]# sh test02.sh 
mkdir: 无法创建目录"/opt/share": 文件已存在
[root@shell ~]# rm -rf /opt/share/
[root@shell ~]# sh test02.sh 
不存在
创建成功

1.2.2: 逻辑测试

  • 基本格式
    格式一: [ 表达式1 ] 操作符 [ 表达式2 ] …
    格式二: 命令1 操作符 命令2 …

  • 且:第一个不成立就不去读第二个

    或:都读

  • [root@shell ~]# [ -d /etc ] && [ -r /etc ] && echo "yes"
    yes
    [root@shell ~]# [ -d /etc ] -a [ -r /etc ] && echo "yes"
    -bash: [: 参数太多                     '-a不是可选项'
    [root@shell ~]# [ 1 -eq 1 -a 2 -eq 2 ] && echo "yes"
    yes
    '-a和-o也可使用在[]中,更加方便'
    

1.2.3: 一元运算符,二元运算符和三元运算符

  • 一元运算符

    带一元运算符的表达式遵循从右到左的结合性,常见的一元表达式:++一元表达式,–一元表达式

  • 前缀自增运算符与前缀自减运算符

  • 在一元表达式的前面添加运算符++或–后得到的表达式是一个一元表达式。操作数将被加1(++)或减1(–),表达式的值是经过加1、减1 以后的值。操作数必须是一个左值。

  • i=1;

  • i++: i=$i+1

  • i=i++:先赋值在运算

  • i=++i:先自加在赋值

  • i=–i:先自减在赋值

[root@localhost opt]# i=1
[root@localhost opt]# echo $i
1
[root@localhost opt]# let i=++i
[root@localhost opt]# echo $i
2
[root@localhost opt]# let i+=2 	'相当于i=i+2'
[root@localhost opt]# echo $i
4
  • 二元运算符

    a + b = c

  • 三元运算符

    条件&&结果1 || 结果2

二:if语句

2.1:if单分支语句

  • 单分支结构(基本格式)
    if 条件测试操作
    then 命令序列
    fi

    mark

  • exit 1 异常退出

    exit 0 正常退出

  • 实操演示

    '单分支if语句'
    [root@shell ~]# vim test03.sh
    
    #!/bin/bash
    read -p "请输入目录位置" file
    if [ ! -d $file ];then
      mkdir -p $file
      echo "$file 已创建"
    fi
    [root@shell ~]# sh test03.sh 
    请输入目录位置:/123
    /123 已创建
    
    

2.2:if 双分支语句

  • 双分支结构(基本格式)
    if 条件测试操作
    then 命令序列1
    else 命令序列2
    fi

  • mark

  • 演示

    [root@shell ~]# vim test03.sh
    
    #!/bin/bash
    read -p "请输入目录位置:" file
    if [ -d $file ];then
      echo "目录已存在"
      else
      mkdir -p $file
      echo "$file已创建"
    fi
    [root@shell ~]# sh test03.sh 
    请输入目录位置:123
    123已创建
    [root@shell ~]# 
    [root@shell ~]# sh test03.sh 
    请输入目录位置:123
    目录已存在
    
    [root@shell ~]# vim pinghost.sh 
    
    #!/bin/bash
    ping -c 3 -i 0.2 -W 3v $1 &> /dev/null
    if [ $? -eq 0 ]
    then
      echo "Host $1 is Up"
    else
      echo "Host $1 is down"
    fi
    [root@shell ~]# vim pinghost.sh 
    
    #!/bin/bash
    ping -c 3 -i 0.2 -W 3v $1 &> /dev/null
    if [ $? -eq 0 ]
    then
      echo "Host $1 is Up"
    else
      echo "Host $1 is down"
    fi
    [root@shell ~]# sh pinghost.sh 14.0.0.1
    Host 14.0.0.1 is down
    [root@shell ~]# sh pinghost.sh www.baidu.com
    Host www.baidu.com is Up
    注意:
    -c:发送三个包
    -i: 发包间隔0.2秒
    -W:等待时间3秒
    

2.3:if 多分支语句

  • 多分支结构(基本格式)
    if 条件测试操作1
    then 命令序列1
    elif 条件测试操作2
    then 命令序列2
    else
    命令序列3
    fi

  • mark

[root@shell ~]# vim chengji02.sh 
#!/bin/bash
read -p "请输入成绩:" score
if [ $score -lt 0 ] || [ $score -gt 100 ]
  then
        echo "输入有误"
        exit 1;
elif [ $score -ge 85 ] && [ $score -le 100 ]
  then
        echo "成绩优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
  then
        echo "成绩合格"
else
[root@shell ~]# sh chengji02.sh 
请输入成绩:88
成绩优秀
[root@shell ~]# sh chengji02.sh 
请输入成绩:82
成绩合格
[root@shell ~]# 
[root@shell ~]# sh chengji02.sh 
请输入成绩:111
输入有误

三:case 分支语句

3.1:case 分支语句

  • 针对变量的不同取值,分别执行不同的命令序列

  • 这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值

  • ;;双分号表示模式结束,不能省略

    *)等同于else,都没有匹配,则执行默认命令序列

    case 常常匹配值

    if else 常匹配区间

    case 往往表示菜单几个选项,模式清单,选项给你选

    格式:
    case 变量值 in
    模式1)
    	命令序列1
    	;;
    模式2)
    	命令序列2
    	;;
    	....
    *)
    	默认命令序列
    esac
    

    mark

[root@shell ~]# vim hitkey.sh

  1 #!/bin/bash
  2 read -p "请输入一个字符,并按回车" key
  3 case "$key" in
  4  [a-z]|[A-Z])
  5    echo "您输入的是字母"
  6   ;;
  7  [0-9])
  8    echo "您输入的是数字"
  9   ;;
 10  *)
 11   echo "您输入的是空格,功能键和其他控制字符串"
 12 esac
[root@shell ~]# sh hitkey.sh 
请输入一个字符,并按回车1
您输入的是数字
[root@shell ~]# sh hitkey.sh 
请输入一个字符,并按回车A
您输入的是字母
  • 判断学生成绩的优良

  • 成绩0-100分

  • 0-59分:不及格

  • 60-74:及格

  • 75-84:良好

  • 85-100:优秀

[root@shell ~]# vim chengji03.sh                         
#!/bin/bash
read -p "请输入你的成绩:" aa
case "$aa" in
#[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])
[1-5][0-9]|[0-9])
        echo "你的成绩不合格"
        ;;
6[0-9]|7[0-4])
        echo "你的成绩合格"
        ;;
7[5-9]|8[0-4])
        echo "你的成绩良好"
        ;;
8[5-9]|9[0-9]|100)
        echo "你的成绩优秀"
        ;;
*)
        echo "输入有误"
esac

[root@shell ~]# sh chengji03.sh 
请输入你的成绩:88
你的成绩优秀
[root@shell ~]# sh chengji03.sh 
请输入你的成绩:50
你的成绩不合格
[root@shell ~]# sh chengji03.sh 
请输入你的成绩:0
你的成绩不合格
[root@shell ~]# sh chengji03.sh 
请输入你的成绩:70
你的成绩合格

3.2:case 嵌套

  • 格式:
    case 变量值 in
    模式1)
    case 变量值 in

    ​ 模式1)

    ​ 命令序列

    ​ ;;

    ​ *)

    ​ 命令序列

    ​ esac

    ;;
    模式2)
    命令序列2
    ;;

    *)
    默认命令序列
    esac

'10秒内,进决赛'
#!/bin/bash
read -p "请输入性别" sex
read -p "成绩" score
 case $sex in
  male)
    case $score in
     [0-9] | 10)
     echo "你已进入男子组决赛"
     ;;
     *)
     echo "你未进入男子组决赛"
   esac
   ;;
   female)
    case $score in
     [0-9] | 10)
      echo "你已进入女子组决赛"
     ;;
     *)
      echo "你未进入女子组决赛"
     esac
     ;;
esac
[root@shell ~]# sh baimi.sh 
请输入性别male
成绩5
你已进入男子组决赛
[root@shell ~]# sh baimi.sh 
请输入性别female
成绩11
你未进入女子组决赛
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值