9.Scripts
本章同步视频:https://edu.51cto.com/sd/e4874
9.4 选择结构
9.4.1 利用 if .... then
condition是判断条件,如果 condition 成立(返回“真”),那么 then 后边的语句将会被执行;如果 condition 不成立(返回“假”),那么不会执行任何语句。
注意,最后必须以fi来闭合,fi 就是 if 倒过来拼写。也正是有了 fi 来结尾,所以即使有多条语句也不需要用{ }包围起来。
[root@localhost tmp]# vim 1.sh
注意 condition 后边的分号;,当 if 和 then 位于同一行的时候,这个分号是必须的,否则会有语法错误。
[root@localhost tmp]# vim 1.sh
[root@localhost tmp]# vim 1.sh
read -p "Please input (Y/N): " yn
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
if [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "I don't know what your choice is" && exit 0
I don't know what your choice is
如果 condition 成立,那么 then 后边的 statement1 语句将会被执行;否则,执行 else 后边的 statement2 语句。
[root@localhost tmp]# vim 1.sh
如果 condition1 成立,那么就执行 if 后边的 statement1;如果 condition1 不成立,那么继续执行 elif,判断 condition2。
如果 condition2 成立,那么就执行 statement2;如果 condition2 不成立,那么继续执行后边的 elif,判断 condition3。
如果 condition3 成立,那么就执行 statement3;如果 condition3 不成立,那么继续执行后边的 elif。
如果所有的 if 和 elif 判断都不成立,就进入最后的 else,执行 statementn。
[root@localhost tmp]# vim 1.sh
if [ "${1}" == "hello" ]; then
echo "You MUST input parameters, ex> {${0} someword}"
echo "The only parameter is 'hello', ex> {${0} hello}"
You MUST input parameters, ex> {1.sh someword}
[root@localhost tmp]# sh 1.sh nihao
The only parameter is 'hello', ex> {1.sh hello}
[root@localhost tmp]# sh 1.sh hello
printf "Input integer number: "
if test $num -eq 1 ; then #第一种条件写法
elif [ $num -eq 2 ] ; then #第二种条件写法
elif [[ $num -eq 3 ]]; then #第三种条件写法
elif ((num==4)); then #第四种条件写法
elif ((num==5)); then #第四种仅限数值用法
9.4.2 利用 case ..... esac 判断
u case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。
u expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
u pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。
u 可以没有*)部分。如果 expression 没有匹配到任何一个模式,那么就不执行任何操作。
u 除最后一个分支外(这个分支可以是普通分支,也可以是*)分支),其它的每个分支都必须以;;结尾,;;代表一个分支的结束。最后一个分支可以写;;,也可以不写。
u 如果不加以说明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式来匹配的。
case 会将 expression 的值与 pattern1、pattern2、pattern3 逐个进行匹配:
如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分支语句中最后的 else 部分。
格式 | 说明 |
* | 表示任意字符串。 |
[abc] | 表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。 |
[m-n] | 表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。 |
| | 表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。 |
printf "Input integer number: "