12.6 使用结构化语句之六(if--then的高级特性及case命令)

一、if–then的高级特性

bash shell提供了两项可在if–then语句中使用的高级特性:
1、用于数字表达式的双括号
2、用于高级字符串处理功能的双方括号

1、使用双括号

双括号命令允许你在比较过程中使用高级数学表达式。test命令只能在比较中使用简单的算术操作。双括号命令提供了更多的数学符号。
双括号命令的格式如下:
(( expression ))
expression可以是任意的数学赋值或比较表达式。除了test命令使用的标准数学运算符,下表列出了双括号命令中会用到的其他运算符。

val++后增
val–后减
++val前增
–val前减
逻辑求反
~位求反
**幂运算
<<左位移
>>右位移
&位布尔和
&&逻辑和

逻辑或是下面的符号,我好像没有找到怎么注释这个:
||
例子:

[root@CHENDAJIE test]# cat test20.sh 
#!/bin/bash
# Using double parenthesis
#
va11=10
#
if (( $va11 ** 2 > 90 ))
then
        (( va12 = $va11 ** 2 ))
        echo "The square of $va11 is $va12"
fi
#
[root@CHENDAJIE test]# chmod u+x test20.sh ^C
[root@CHENDAJIE test]# ./test20.sh 
The square of 10 is 100

【注意】
不需要将双括号中表达式里的大于号转义。这是双括号命令提供的另一个高级特性。

2、使用方括号

双方括号命令提供了针对字符串比较的高级特性。双方括号命令的格式如下:
[[ expression ]]
双方括号的expression使用了test命令中采用的标准字符串比较。但它提供了test命令未提供的另一个特性—模式匹配( pattern matching )
【说明】:双方括号在bash shell中工作良好。不过要小心,不是所有的shell都支持双方括号。
在模式匹配中,可以定义一个正则表达式来匹配字符串值。
例1:

[root@CHENDAJIE test]# cat test21.sh 
#!/bin/bash
# Using pattern matching
#
if [[ $USER == c* ]]
then
        echo "Hello $USER"
else
        echo "Sorry, I do not know you"
fi
#
[root@CHENDAJIE test]# chmod u+x test21.sh ^C
[root@CHENDAJIE test]# ./test21.sh 
Hello chendajie

在上面的脚本中,我们使用了双等号( == )。双等号将右边的字符串 ( c* )视为一个模式,并应用模式匹配。双方括号命令$USER环境变量进行模式匹配,看它是否以字母c开头。如果是的话,比较通过,shell会执行then部分的命令。

二、case命令

例1:

[root@CHENDAJIE test]# cat test22.sh  
#!/bin/bash
# Looking for a possible value
#
if [ $USER = "chendajie" ]
then
        echo "Welcome $USER"
        echo "Please enjoy your visit"
elif [ $USER = "babbababba" ]
then
        echo "Welcome $USER"
        echo "Please enjoy your visit"
elif [ $USER = "testing" ]
then
        echo "Welcome $USER"
        echo "Please enjoy your visit"
elif [ $USER = "aaa" ]
then
        echo "Welcome $USER"
        echo "Please enjoy your visit"
elif [ %USER = "ccc" ]
then
        echo "Do not forget to logout when you're done"
else 
        echo "Sorry, you are not allowed here"
fi
#
[root@CHENDAJIE test]# chmod u+x test22.sh     
[root@CHENDAJIE test]# ./test22.sh 
Welcome chendajie
Please enjoy your visit

elif语句继续检查if—then检查,为比较变量寻找特定的值。

case variable in
pattern1 | pattern2) commands1;;
pattern3 commands2;;
*) default commands;;
esac

case命令会将指定的变量与不同模式进行比较。如果变量和模式是匹配的,那么shell会执行为该模式指定的命令。可以通过竖线操作符在一行中分隔出多个模式模式。星号会捕获所有与已知模式不匹配的值。
下面这个例子将if–then–else程序转换为case命令:

[root@CHENDAJIE test]# cat test23.sh 
#!/bin/bash
# Using the case comand
#
case $USER in 
chendajie | babbababba)
        echo "Welcome, $USER"
        echo "Please enjoy your visit";;
testing)
        echo "Special testing account";;
ccc)
        echo "Sorry,you are not allowed here";;
esac
#
[root@CHENDAJIE test]# chmod u+x test23.sh  
[root@CHENDAJIE test]# ./test23.sh 
Welcome, chendajie
Please enjoy your visit

case命令提供了一个更加清晰的方法来为变量每个可能的值指定不同的选项。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值