Linux Bash case : 5 个 Bash case 语句示例

举报
Tiamo_T 发表于 2022/03/11 18:27:12 2022/03/11
【摘要】 Bash shell case 语句类似于 C 中的 switch 语句.它可用于测试简单的值,如整数和字符。 case 语句不是循环,它不会执行 n 次代码块,相反,bash shell 检查条件并控制程序的流程。

Bash shell case 语句类似于 C 中的 switch 语句.它可用于测试简单的值,如整数和字符。

case 语句不是循环,它不会执行 n 次代码块,相反,bash shell 检查条件并控制程序的流程。

在本文中,让我们通过 5 个实际示例来了解 bash case 命令。

bash shell 中的 case 构造允许我们针对可能包含通配符的模式测试字符串。Bash case 语句是bash if-then-else 语句的最简单形式。

bash case 语句的语法。

case expression in
    pattern1 )
        statements ;;
    pattern2 )
        statements ;;
    ...
esac

以下是 bash case 语句的要点:

  • Case 语句首先扩展表达式并尝试将其与每个模式匹配。
  • 当找到匹配项时,执行双分号 (;;) 之前的所有关联语句。
  • 在第一次匹配之后,case 以最后执行的命令的退出状态终止。
  • 如果没有匹配,则 case 的退出状态为零。

Bash case示例 1. 向进程发送信号

以下脚本接受信号编号和进程 ID 作为其参数,并使用信号名称将信号发送到给定的进程 ID。

这个脚本是为了演示case语句的用法。

$ cat signal.sh
#!/bin/bash

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

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
    ;;
9) echo  "Sending SIGKILL signal"
   kill -SIGKILL $2
   ;;
*) echo "Signal number $1 is not processed"
   ;;
esac

在上面的例子中:

  • $1 和 $2 分别是信号编号和进程 ID。
  • 使用 kill 命令,它将相应的信号发送到给定的进程 ID。
  • 它执行 sleep 命令几秒钟。
  • 可选的最后比较 *) 是默认情况,它匹配任何内容。

上述shell脚本的用法:找出sleep命令的进程id,向该进程id发送kill信号,杀死进程。

$ sleep 1000

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

$ ./signal.sh 9 23277
Sending SIGKILL signal

$ sleep 1000
Killed


Bash case示例。2. 文件中的模式匹配

此示例打印行数、单词数并删除与给定模式匹配的行。

$ cat fileop.sh
#!/bin/bash

# Check 3 arguments are given #
if [ $# -lt 3 ]
then
        echo "Usage : $0 option pattern filename"
        exit
fi

# Check the given file is exist #
if [ ! -f $3 ]
then
        echo "Filename given \"$3\" doesn't exist"
        exit
fi

case "$1" in

# Count number of lines matches
-i) echo "Number of lines matches with the pattern $2 :"
    grep -c -i $2 $3
    ;;
# Count number of words matches
-c) echo "Number of words matches with the pattern $2 :"
    grep -o -i $2 $3 | wc -l
    ;;
# print all the matched lines
-p) echo "Lines matches with the pattern $2 :"
    grep -i $2 $3
    ;;
# Delete all the lines matches with the pattern
-d) echo "After deleting the lines matches with the pattern $2 :"
    sed -n "/$2/!p" $3
    ;;
*) echo "Invalid option"
   ;;
esac

上述脚本的执行如下所示。

$ cat text
Vim is a text editor released by Bram Moolenaar in 1991 for the Amiga computer.
The name "Vim" is an acronym for "Vi IMproved" because Vim was created as an extended version of the vi editor, with many additional features designed to be helpful in editing program source code.
Although Vim was originally released for the Amiga, Vim has since been developed to be cross-platform, supporting many other platforms.

Bash case 正则表达式输出。删除与模式 Vim 匹配的行后:

$ ./fileop.sh  -d Vim text
It is the most popular editor amongst Linux Journal readers.

Bash case示例 3. 从扩展中查找文件类型

此示例根据文件名的扩展名打印文件的类型(文本、Csource 等)。

$ cat filetype.sh
#!/bin/bash
for filename in $(ls)
do
	# Take extension available in a filename
        ext=${filename##*\.}
        case "$ext" in
        c) echo "$filename : C source file"
           ;;
        o) echo "$filename : Object file"
           ;;
        sh) echo "$filename : Shell script"
            ;;
        txt) echo "$filename : Text file"
             ;;
        *) echo " $filename : Not processed"
           ;;
esac
done

$ ./filetype.sh
a.c : C source file
b.c : C source file
c1.txt : Text file
fileop.sh : Shell script
obj.o : Object file
text : Not processed
t.o : Object file

Bash case示例 4. 提示用户是或否

在大多数软件安装中,在许可协议期间,它会要求用户输入是或否。以下代码片段是从用户获取是或否输入的方法之一。

$ cat yorno.sh
#!/bin/bash

echo -n "Do you agree with this? [yes or no]: "
read yno
case $yno in

        [yY] | [yY][Ee][Ss] )
                echo "Agreed"
                ;;

        [nN] | [n|N][O|o] )
                echo "Not agreed, you can't proceed the installation";
                exit 1
                ;;
        *) echo "Invalid input"
            ;;
esac

$ ./yorno.sh
Do you agree with this? [yes or no]: YES
Agreed

如果有多个由管道字符分隔的模式,则表达式可以匹配其中的任何一个,以便运行关联的语句。按顺序检查模式,直到找到匹配项;如果没有找到,则不会发生任何事情。

另外,请参阅我们之前的15 个 bash 数组示例文章。

Bash case示例 5. 启动脚本

/etc/init.d 目录中的启动脚本使用 case 语句来启动和停止应用程序。

您可以使用任何类型的模式,但始终建议您在测试原语值时使用 case 语句。(即整数或字符)。

$ cat startpcapp
#!/bin/bash

case "$1" in
'start')
echo "Starting application"
/usr/bin/startpc
;;
'stop')
echo "Stopping application"
/usr/bin/stoppc
;;
'restart')
echo "Usage: $0 [start|stop]"
;;
esac

$ ./startpcapp start
Starting application
/usr/bin/startpc started
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。