shell脚本case分支
case $变量名 in "第一个变量") 程序段 ;; "第二个变量") 程序段 ;; *) exit 1 ;; esac以case为开头,结尾esac是将case的英文反过来写!
每一个变量分支的程序段最后都需要两个分号;;来作为程序段的结束!
最后的*)分支为不符合上面任何一个分支就会进入该分支!
我们将hello-2.sh的案例修改一下,变成这样:
[peter@study bin]$ vim hello-3.sh #!/bin/bash # Program: # Show "Hello" from $1.... by using case .... esac # History: # 2015/07/16 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH case ${1} in "hello") echo "Hello, how are you ?" ;; "") echo "You MUST input parameters, ex> {${0} someword}" ;; *) echo "Usage ${0} {hello}" ;; esac输入sh hello-3.sh test执行, 屏幕上就会出现Usage hello-3.sh {hello}的字样,告知执行者仅能够使用hello, 这样的方式对于需要某些固定字符串来执行的变量内容就显的更加的方便呢!
很多服务的启动scripts都是使用这种写法的,虽然CentOS 7已经使用systemd,不过仍有数个服务是放在/etc/init.d/目录下!
例如有个名为netconsole的服务在该目录下, 想要重新启动该服务,以root身份这样执行:
/etc/init.d/netconsole restart后面的restart就是脚本的参数, 用less /etc/init.d/netconsole查看该文件可以看到里面使用的正是case语法, 并且会规定某些既定的变量内容, 可以直接下达/etc/init.d/netconsole, 该script就会告知有哪些可以使用的参数变量。
一般来说,在case $变量 in语法中,$变量大致有两种获取方式:
命令行参数:利用script.sh variable,直接提供命令行参数的方式给予$1变量的内容,这也是/etc/init.d目录下大多数程序的设计方式。
交互式:透过read指令让用户输入变量的内容。
让用户输入one, two, three,并且将输入的变量显示到屏幕上,如果输入的不是one, two, three,就告知用户仅有这三种选择:
[peter@study bin]$ vim show123.sh #!/bin/bash # Program: # This script only accepts the flowing parameter: one, two or three. # History: # 2015/07/17 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo "This program will print your selection !" # read -p "Input your choice: " choice # 暂时取消,可以替换! # case ${choice} in # 暂时取消,可以替换! case ${1} in # 现在使用,可以用上面两行替换! "one") echo "Your choice is ONE" ;; "two") echo "Your choice is TWO" ;; "three") echo "Your choice is THREE" ;; *) echo "Usage ${0} {one|two|three}" ;; esac使用sh show123.sh two执行该脚本,就可以收到相对应的响应了。
上面使用的是直接使用命令行参数的方式,如果使用的是交互式时, 只需将上面的两行"#"去掉, 并将下一个行注释掉(#), 就可以让用户输入参数!
initroot编辑整理,转载请注明www.initroot.com
100次点赞
100次阅读