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的任意一个字符 |
| | 多重选择,类似于或运算 |