Linux Bash case : 5 个 Bash case 语句示例
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
- 点赞
- 收藏
- 关注作者
评论(0)