Linux Shell 脚本:条件语句 0 个改进

在本章中,我们将会了解 Unix 中 Shell 脚本的一些决策。在编写 Shell 脚本的时候,有时候需要从给定的两种情形中,选择一种情形执行。这时候,就可以使用条件语句,这些条件语句允许程序做出正确的决定并执行。

Unix 系统的 Shell是支持条件语句的,这些条件语句用于根据不同的条件执行不同的操作。接下来,我们将在此处了解两个条件语句的句式。

  • if...else 句式

  • case...esac 句式

if...fi 句式

if...fi 句式是条件语句比较基本的句式。它使 Shell 可以有条件地进行决策和执行语句。

句法

if [ expression ] 
then 
   Statement(s) to be executed if expression is true 
fi

Shell expression 会按照上面的语法执行。 如果 expression 返回的值为 true,则执行给定的statement(s)。如果返回的是 false,则不会执行任何语句。大多数情况下,比较运算符用于制定决策。

建议注意括号和 expression 之间的空格。没有空格会产生语法错误。

如果 expression 是一个 shell 命令,那么如果它在执行后返回 0,它将被假定为 true。如果它是布尔表达式,则返回 true 时将为 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

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 会按照上面的语法执行。 如果 expression 返回的值为 true,则执行给定的 statement(s)。如果返回的是 false,则不会执行任何语句。

Example

上面的示例也可以使用 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

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 语句,其中每一个 if 都是上一个条件语句的 else 部分。这里执行哪一部分代码是根据 if 返回的条件是不是 true 。如果条件都不为 true,则执行 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
      ;;
   *)
     Default condition to be executed
     ;;
esac

在此,将字符串字词与每个模式进行比较,直到找到匹配项。 执行匹配模式之后的语句。 如果未找到匹配项,则case语句将不执行任何操作而退出。

没有最大数量的模式,但最小数量为 1。

当语句部分执行到命令「;;」指示程序流应跳到整个 case 语句的末尾。 这类似于 C 编程语言中的中断。

例子

#!/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 # 状态为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
$
本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!