case $1 in
-f)
... 针对-f玄子昂的程序代码
;;
-d | --directory) #允许长选项
... 针对-d选项的程序代码
;;
*)
echo $1:unkonw option >$2
exit 1
#在esac之前的;;形式是一个好习惯,不过并非必要
esac
这里我们看到,要测试的值出现在 case 和 in 之间.将值以双引号括起来并非必要,但也无妨.要测试的值,根据 shell 模式的列别一次测试,返现匹配的时候,便执行相对应的程序代码,直至;;为止.可以使用多个模式,只要| 字符加以分割即可.这种情况称为”or(或)”.模式里会包含任何的 shell 统配字符,且变量,命令与算数替换会在它用作模式匹配之前在此值上被终止.
可能会觉得每个模式列表之后的部队称的右圆括号有点奇怪,不过这也是 shell 于艳丽部队称定界符的位移实例.
最后的*模式视窗通用发,但是非必须的,他作为一个默认的情况.这通常实在你要现实诊断信息并退出时使用.最后一个情况不再需要结尾的;;,不过加上他,会是比较好的形式
案例:提示输入 1 到 4,与每一种模式进行匹配
bash 代码:
echo 'input your a number 1 to4'
echo 'your number is : \n'
read aNum
case $aNum in
1)echo 'number 1'
;;
2)echo 'number 2'
;;
3)echo 'number 3'
;;
4)echo 'number 4'
;;
*)echo 'number default'
;;
esac
案例二:判断输入文件是文件还是目录
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
;;
esac
案例三:
bash代码;
#!/bin/bash
name='basename $0 .sh'
case $1 in
s|start) echo "start..."
;;
stop) echo "stop ..."
;;
reload)echo "reload..."
;;
*)echo "Usage: $name [start|stop|reload]"
exit 1
;;
esac
注意:1、 ) 相当于其他语言中的 default。
2、除了)模式,各个分支中;;是必须的,;;相当于其他语言中的 break
3、 | 分割多个模式,相当于 or
复习一下变量说明:
变量 |
作用 |
$$ |
shell本身的PID(ProcessID) |
$! |
sehll最后运行运行的后台Process的PID |
$? |
最后运行的命令的结束代码(返回值) |
$- |
使用set命令设定的Flag一览 |
$* |
所有参数列表.如”$*”用圆括号括起来,以”$1 $2 ...$n”的行为输出所有参数 |
$@ |
所有参数列表,如果”$@”用圆括号括起来,以”$1” “$2” “$n”的形式输出所有参数 |
$# |
添加到shell的参数个数 |
$0 |
shell本身的文件名 |
$1~$n |
添加到sehll的各参数值.$1是第一个参数,$2是第二个参数,以此类推 |
案例:
printf "The complete list is %s\n" "$$"
结果:The complete list is 1567