一、Shell条件语句
在编写 shell
脚本,有可能是一种情况,当你需要采取一个路径两条路径。所以,需要利用条件语句,让程序作出正确的决策和执行正确的动作。
UNIX Shell 支持条件语句,从而根据不同的条件下执行不同的操作。在这里,我们将解释以下两个决策语句:
- if…else 语句
- case…esac 条件语句
二、if…else 语句
if else
语句是有用的决策语句,可以用来从一个给定的选项中选择一个选项。
UNIX Shell
支持以下形式的 if.. else
语句:
- if…fi 语句
- if…else…fi 语句
- if…elif…else…fi 语句
大部分的 if
语句检查前面的章节中讨论的关系运算符的关系。
2.1 if…fi语句
if...fi
语句的基本控制语句,它允许 Shell
有条件作出决定并执行语句。
语法:
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
Shell expression
求值。如果结果值是 true
,给定 statement
被执行。如果 expression
为 false
,则没有语句将不会被执行。大部分的时候,会使用比较操作符决策。
关注对括号和表达之间的空间。这个空间是强制性的,否则语法错误。
如果 expression
是一个 shell
命令,那么它会被假定如此,如果它执行后返回 0
。如果它是一个布尔表达式,那么返回 true
。
🌰举个例子:
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi
这将产生以下结果:
a is not equal to b
2.2 if…else…fi 语句
if...else...fi
语句是控制语句,它允许下一个表格执行语句 Shell
更可控的方式在两个选择之间作出决定。
语法:
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
Shell expression
求值。如果结果值是真实的,给定 statement(s)
被执行。如果表达式为 false
,则语句将不会被执行。
🌰举个例子:
如果我们把上面的例子中,那么它可以用更好的方式使用 if...else
语句如下:
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
else
echo "a is not equal to b"
fi
这将产生以下结果:
a is not equal to b
2.3 if…elif…fi 语句
if...elif...fi
语句是提前一个级别的控制语句,形式出几个条件,允许 Shell 作出正确的决定。
语法:
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi
这段代码没有什么特别的。这仅仅是一个系列,if
语句每一个语句 else
子句的一部分。下面语句是执行的基础上的真实情况,如果条件不为 ture
,则执行 else
块。
🌰举个例子:
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
elif [ $a -lt $b ]
then
echo "a is less than b"
else
echo "None of the condition met"
fi
这将产生以下结果:
a is less than b
三、case…esac 语句
可以使用多个 if...elif
语句执行多分支。然而,这并不总是最佳的解决方案,尤其是当所有的分支依赖于一个单一的变量的值。
Shell
支持 case...esac
语句处理正是这种情况下,它这样做比 if...elif
语句更有效。
语法:
case...esac
语句基本语法 是为了给一个表达式计算和几种不同的语句来执行基于表达式的值。
解释器检查每一种情况下对表达式的值,直到找到一个匹配。如果没有匹配,默认情况下会被使用。
case word in
pattern1)
Statement(s) to be executed if pattern1 matches
;;
pattern2)
Statement(s) to be executed if pattern2 matches
;;
pattern3)
Statement(s) to be executed if pattern3 matches
;;
esac
这里的字符串字每个模式进行比较,直到找到一个匹配。执行语句匹配模式。如果没有找到匹配,声明退出的情况下不执行任何动作。
没有最大数量的模式,但最小是一个。
当语句部分执行,命令 ;;
表明程序流程跳转到结束整个 case
语句。和 C
编程语言的 break
类似。
🌰举个例子:
#!/bin/sh
FRUIT="kiwi"
case "$FRUIT" in
"apple") echo "Apple pie is quite tasty."
;;
"banana") echo "I like banana nut bread."
;;
"kiwi") echo "New Zealand is famous for kiwi."
;;
esac
这将产生以下结果:
New Zealand is famous for kiwi.
case
语句是一个很好用的命令行参数如下计算:
#!/bin/sh
option="${1}"
case ${option} in
-f) FILE="${2}"
echo "File name is $FILE"
;;
-d) DIR="${2}"
echo "Dir name is $DIR"
;;
*)
echo "`basename ${0}`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
esac
下面是一个示例运行这个程序:
$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
$ ./test.sh -f index.htm
$ vi test.sh
$ ./test.sh -f index.htm
File name is index.htm
$ ./test.sh -d unix
Dir name is unix
$
四、总结
其实很多语言比如js、c#、java 等都有条件语句,而且基本一致,也容易理解,但是shell 条件语句确实看着别扭,但大体是一样的。