Shell选择结构

10 篇文章 0 订阅
9 篇文章 0 订阅

Shell选择结构

Shell 中的选择结构有两种形式, if else 和 case in 语句,都是根据命令的退出状态来判断条件是否成立。

Shell中判断条件和java等语言比起来会有一些不同,需要慢慢习惯

if else形式

if语句

格式

if condition
then
    statement(s)
fi

最后必须以fi来闭合,fi就是if 倒过来拼写。也正是有了fi 来结尾,所以即使有多条语句也不需要用{ }包围起来。

示例

#!/bin/bash

read a
read b
if (( $a == $b ))
then
    echo "相等"
fi
if else语句

有两个分支,就可以使用 if else 语句

格式

if  condition
then
   statement1
else
   statement2
fi

如果 condition 成立,那么 then 后边的 statement1 将会被执行;否则,执行 else 后边的 statement2

示例

#!/bin/bash

read a
read b
if (( $a == $b ))
then
    echo "相等"
else
    echo "不等"
fi
if elif else语句

支持任意数目的分支,当分支比较多时,可以使用 if elif else 结构

格式

if  condition1
then
   statement1
elif condition2
then
    statement2
……
else
   statementn
fi

示例

#!/bin/bash

read a
read b
if (( $a == $b ))
then
    echo "相等"
elif (( $a > $b ))
then
    echo "大于"
else
    echo "小于"
fi

test(同[])详解

在前边运算符中已经涉及到了[]的使用,接下来详细介绍其作用和功能

test[]是等价的,通常与if语句一起使用,并且大部分if语句都依赖test

test[] 中使用变量建议用双引号包围起来,这样可以避免变量为空值时导致的很多奇葩问题

格式
[ expression ]
test expression

注意[]expression之间的空格,这两个空格是必须的,否则会导致语法错误。[]的写法更加简洁,比 test使用频率高。

test中使用变量时建议使用双引号包围

在前面一节运算符中我们列举了[]在运算符中的使用,包含文件检测数值运算字符串判断逻辑运算.

[[]]详解

test 能做到的,[[ ]]也能做到,而且[[ ]]做的更好;test 做不到的,[[ ]]还能做到。可以认为[[ ]]test的升级版,对细节进行了优化,并且扩展了一些功能。

格式
[[ expression ]]

注意[[ ]]expression之间的空格,这两个空格是必须的,否则会导致语法错误。

[[]]与[]的差别

[]运算符[[]]运算符
变量名需要用双引号""包围不需要使用双引号""包围
特殊字符转义需要对><进行转义不需要对><进行转义

[[]]支持逻辑运算符

对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个test命令连接起来,也可以借助选项把多个表达式写在同一test中,换成[[]]运算符的话就同时会支持&&||!三种逻辑运算符

# 连接多个test
[ -z "$str1" ] || [ -z "$str2" ]
# 连接表达式
[ -z "$str1" -o -z "$str2" ]
# [[]]支持逻辑运算符,不在支持`-o`、`-a`
[[ -z $str1 || -z $str2 ]]
# 连接多个[[]]
[[ -z $str1 ]] || [[ -z $str2 ]]

[[]]支持正则表达式

在shell的[[]]中,可以使用=~来检测字符串是否符合某个正则表达式

格式
[[ str =~ regex ]]
实例
#!/bin/bash

read email
if [[ $email =~ ^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ ]]
then 
    echo "输入邮箱格式正确"
else
    echo "输入邮箱格式错误"
fi
输出结果
z123@126.com
输入邮箱格式正确

case in 语句

当分支较多、判断条件比较简单时,使用case in语句更加方便

格式
case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    *)
        default
esacpattern

expression 可以是一个变量、数字、字符串或者数学表达式、命令执行结果等

pattern可以是一个数字、字符串、甚至简单的正则

*) 是代表default,即默认返回

;;表示break跳出

实例
#!/bin/bash

printf "输入整数:"
read num

case $num in
    1)
        echo "Monday"
        ;;
    2)
        echo "Tuesday"
    	;;
    3)
    	echo "Wednesday"
    	;;
    4)
    	echo "Thursday"
    	;;
    5)
    	echo "Friday"
    	;;
    *)
    	echo "weekday"
esac
输出结果
输入整数:2
Tuesday
case in 与 正则表达式

case in 支持部分简单的正则表达式

格式说明
*匹配任意字符串
[abc]a、b、c中任意一个
[m-n]从m到n的任意一个字符
|多重选择,类似于或运算
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值