📜  Bash 脚本 – 案例陈述

📅  最后修改于: 2022-05-13 01:57:30.113000             🧑  作者: Mango

Bash 脚本 – 案例陈述

当必须针对多个选择做出决定时,使用 bash 脚本中的 case语句。换句话说,当表达式可能有多个值时,它很有用。这种方法可以看作是脚本中多个 if 语句的替代品。 Case 语句优于 if 语句,因为它提高了代码的可读性并且更易于维护。 Bash 脚本中的 Case 语句与 C 语言中的 Case 语句非常相似。但与 C 不同的是,Bash Case 语句在匹配发生后立即停止继续搜索。简而言之,它们不需要任何强制在 C 中使用的 break 语句来停止进一步搜索模式。

case 语句的基本语法如下所示,

句法:

case EXPRESSION in
  Pattern_Case_1)
   STATEMENTS
   ;;
 Pattern_Case_1)
   STATEMENTS
   ;;
 Pattern_Case_N)
   STATEMENTS
   ;;
 *)
   STATEMENTS
   ;;
esac
  • case 语句以 case 关键字开头,后跟一个表达式in关键字。
  • 它以esac关键字结尾。
  • 多个模式案例可以使用 | 分隔运算符。
  • 右括号运算符')' 用于结束模式案例列表。
  • 模式案例可以包含特殊字符。
  • 模式案例及其主体称为子句。
  • 模式案例主体必须后跟;;。
  • 如果一个表达式与两个模式 case 匹配,那么在这种情况下,与表达式匹配的第一个匹配模式 case 对应的主体将被执行。
  • 就像 C 为 default 语句提供了 default 关键字,同样在 Bash case 语句中,我们可以使用通配符星号 (*) 并定义最终模式 case 来定义 default case。
  • 如果没有匹配的模式,则返回状态为零。否则,返回状态是匹配模式案例的执行主体的退出状态。

示例 1:输出每个选项的描述

在这个例子中,一个脚本允许用户选择一个部门,并在 echo 命令的帮助下显示与输入相对应的描述。在此脚本中,我们将 DEPARTMENT 变量指定为“计算机科学”。因此,第一个模式案例的主体被执行。

您可以按照以下说明进行操作:

1. 打开终端(Ctrl + Alt + T)并创建脚本:

department.sh

2. 将这些语句添加到脚本中:

#!/bin/bash


DEPARTMENT="Computer Science"

echo -n "Your DEPARTMENT is "

case $DEPARTMENT in

  "Computer Science")
    echo -n "Computer Science"
    ;;

   "Electrical and Electronics Engineering" | "Electrical Engineering")
    echo -n "Electrical and Electronics Engineering or Electrical Engineering"
    ;;

  "Information Technology" | "Electronics and Communication")
    echo -n "Information Technology or Electronics and Communication"
    ;;

  *)
    echo -n "Invalid"
    ;;
esac

3. 每一行描述如下:

  • 脚本的第一行以 shebang (#!) 开头。
  • 它指示操作系统使用特定的解释器来解析脚本。
  • 我们已将 DEPARTMENT 变量初始化为“计算机科学”。
  • 现在,我们使用 case 语句。
  • 每个表达式都通过 case 语句处理。
  • 最后一行 esac 用于终止 case 语句。

4. 保存脚本。

5. 运行脚本。

./department.sh

输出:

输出每个选项的描述

示例 2:使用多个模式案例

在每个子句中,我们可以使用多个模式案例。如果表达式与至少一个模式案例匹配,则执行该子句的主体。在此脚本中,我们将 DEPARTMENT 变量指定为“电子和通信”。第三种模式案例有两个由竖线 (|)运算符分隔的值。因此,第三个模式案例的主体被执行。

您可以按照以下说明进行操作:

1. 打开终端(Ctrl + Alt + T)并创建脚本:

department.sh

2. 将这些语句添加到脚本中:

#!/bin/bash

DEPARTMENT="Electronics and Communication"

echo -n "Your DEPARTMENT is "

case $DEPARTMENT in

  "Computer Science")
    echo -n "Computer Science"
    ;;

   "Electrical and Electronics Engineering" | "Electrical Engineering")
    echo -n "Electrical and Electronics Engineering or Electrical Engineering"
    ;;

  "Information Technology" | "Electronics and Communication")
    echo -n "Information Technology or Electronics and Communication"
    ;;

  *)
    echo -n "Invalid"
    ;;
esac

3. 下面对每一行进行了讨论:

  • 脚本的第一行以 shebang (#!) 开头。
  • 它指示操作系统使用特定的解释器来解析脚本。
  • 我们已经将 DEPARTMENT 变量初始化为“Electronics and Communication”。
  • 现在,我们使用 case 语句。
  • 每个表达式都通过 case 语句处理。
  • 最后一行 esac 用于终止 case 语句。

4. 保存脚本。

5. 运行脚本。

./department.sh

输出:

使用多种模式案例

3. 保存脚本。

5. 运行脚本。

./department.sh

示例 3:for 循环

在这个脚本中,我们在数组 DEPARTMENT 中分配了一个班级的三个学生的部门。换句话说,我们将处理多个在 DEPARTMENT 变量中描述的表达式。要遍历多个表达式,我们可以使用 for 循环。

您可以按照以下说明进行操作:

1. 打开终端(Ctrl + Alt + T)并创建脚本:

department.sh

2. 将这些语句添加到脚本中:

#!/bin/bash

DEPARTMENT=("Electronics and Communication", "Computer Science", "Information Technology")

for value in "${DEPARTMENT[@]}"
do 

case $value in

  "Computer Science")
    echo -n "Computer Science "
    ;;

  "Electrical and Electronics Engineering" | "Electrical Engineering")
    echo -n "Electrical and Electronics Engineering or Electrical Engineering "
    ;;

  "Information Technology" | "Electronics and Communication")
    echo -n "Information Technology or Electronics and Communication "
    ;;

  *)
    echo -n "Invalid "
    ;;
esac
done

3. 每一行描述如下:

  • 脚本的第一行以 shebang (#!) 开头。
  • 它指示操作系统使用特定的解释器来解析脚本。
  • 我们已经用三个字符串字面量初始化了一个数组 DEPARTMENT 。
  • 现在,在 for 循环的帮助下,我们正在遍历元素数组。
  • 每个表达式都通过 case 语句处理。
  • 最后一行 esac 用于终止 case 语句。

4. 保存脚本。

5. 运行脚本。

./department.sh

输出:

for 循环

示例 4:使用“是”或“否”提示用户

您可以按照以下说明进行操作:

1. 打开终端(Ctrl + Alt + T)并创建脚本:

student.sh

2. 将这些语句添加到脚本中:

#!/bin/bash

echo -n "Are you a student? [yes or no]: "
read response
case $response in

        "Y" | "y" | "YES" | "Yes" | "yes")
                echo -n "Yes, I am a student."
                ;;

        "N" | "n" | "No" | "NO" | "no" | "nO")
                echo -n "No, I am not a student.";
                
                ;;
        *) echo -n "Invalid input"
            ;;
esac

3. 每一行解释如下:

  • 脚本的第一行以 shebang (#!) 开头。
    • 它指示操作系统使用特定的解释器来解析脚本。
  • 提示用户“你是学生吗? [是还是不是]”。
  • 现在用户通过键盘给出响应。
  • 响应的输出已通过 case 语句处理。
  • 最后一行 esac 用于终止 case 语句。

4. 保存脚本。

5. 使用以下命令运行脚本。

./student.sh

输出:

用是或否提示用户

示例 5:向进程发送信号

您可以按照以下说明进行操作:

1. 打开终端(Ctrl + Alt + T)并创建脚本:

signals.sh

2. 将这些语句添加到脚本中:

#!/bin/bash

if [ $# -lt 2 ]
then
        echo "Usage : $0 Signalnumber PID"
        exit
fi

# Case statement
# Signal number (expression)
case "$1" in

1)  echo "Sending SIGHUP signal....."
    kill -SIGHUP $2
    ;;
2)  echo  "Sending SIGINT signal....."
    kill -SIGINT $2
    ;;
3)  echo  "Sending SIGQUIT signal....."
    kill -SIGQUIT $2
    ;;
4) echo  "Sending SIGKILL signals....."
   kill -SIGKILL $2
   ;;
*) echo "Signal number $1 has not been processed"
   ;;
esac

3. 每一行解释如下:

  • $1 是信号编号,$2 是进程 ID。
  • 要向给定的进程 ID 传递或发送信号,我们使用 kill 命令。
  • 这将运行 sleep 命令几秒钟。
  • 可选的最后一个比较 *) 的主体将在默认情况下执行。

4. 保存脚本。

5. 使用以下命令运行脚本。

./signals.sh

输出:

$ sleep 10000

$ ps -a | grep sleep
23277 pts/2    00:00:00 sleep

$ ./signals.sh 9 31231
Sending SIGKILL signal

$ sleep 10000
Killed