1.利用 case ..... esac 判断
1.1 认识case ..... esac
上一篇文章提到的if ... then ... fi
对于变量的判断是以 “比对” 的方式来分辨的,如果符合状态,就进行某些行为,并且透过较多层次(就是elif...)的方式来进行多个变量的程序代码撰写。case ..... esac
也是条件判断式,它拥有和if ... then ... fi
同样的功能,只是代码形式上不太相同。
case ..... esac
的语法结构:
把上一篇Linux 之 shell script -- 条件判断式(if ... then)中的
hello-2.sh
用case .. in .. esac
的语法改写一下
vi hello-3.sh
输入如下内容:
#!/bin/bash
case ${1} in
"hello")
echo "Hello,how are you ?"
;;
"")
echo "You must input parameters, ex> {${0} someword}"
;;
*) #其实就相当于通配符,0-无穷多个任意字符之意!
echo "Usage ${0} {hello}"
;;
esac
1.2 ${变量} 获取方式
使用 「case $变量 in」这个语法中,当中的 「$变量」大致有两种取得的方式
- 1)直接下达式
利用「script.sh variable」的方式来直接给予$1
这个变量的内容,这也是在/etc/init.d目录下大多数程序的设计方式 - 2)交互式
透过 read 这个指令来让用户输入变量的内容,例如前面几篇学习中我们一直用到的read -p
~~举一个例子来深入理解 $1的下达方式~~
让使用者能够输入one,two,three并且将用户的变量显示到屏幕上,如果不是one,two,three时,就告知使用者仅有这三种选择。
vi show123.sh
写入如下代码
#!/bin/bash
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
以上这段代码是 直接下达式 获取 $变量,如果改成 交互式:
可以将3,4行的#
拿掉,同时给第5行加上#
2. 利用 function 功能
2.1 认识 function
函数可以在shell script 当中作出一个类似自定义执行指令的东西,最大的功能是,可以简化我们很多的程序代码。
-
函数 的语法是这样的
其中fname是我们定义的函数名,而function的设定一定要在程序的最前面。
2.2 function 实践
2.2.1 function初显威力
在这里,我们改写👆用到过的show123.sh
(自定义一个名为printit的函数)
vi show123-2.sh
写入如下代码
- 第2-4行为 printit 函数定义
- 第5行为程序介绍
- 第6行到最后就是
case ... esac
形式的多级判断
#!/bin/bash
function printit(){
echo -n "Your choice is" #加上 -n可以不断行继续在同一行显示
}
echo "This program will print your selection !"
case ${1} in
"one")
printit; echo ${1} | tr 'a-z' 'A-Z' #这里用 tr 将参数做大小写转换
;;
"two")
printit; echo ${1} | tr 'a-z' 'A-Z' #这里";"号的存在,是为了实现命令的连续下达
;;
"three")
printit; echo ${1} | tr 'a-z' 'A-Z'
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac
可以看得出来,这个show123-2.sh
可是一个直接下达式获取变量的shell,因此运行时不要忘记在命令行执行shell时,在其后为$1
赋值。
2.2.2 function 威力升级
如果某些程序代码一再地在script当中重复,这个function不但可以简化程序代码,而且可以做成类似“模块”的东西。show123-2.sh
还是没有竭尽全力得发挥函数的功能,下面对show123.sh
再做一次 升级~
function的内建变量:
看function威力升级之前先了解这个:function也是拥有内建变量的,他的内建变量与shell script很类似,函数名称代表$0
,而后续接的变量也是以$1
,$2
来取代的
vi show123-3.sh
写入如下代码:
#!/bin/bash
function printit(){
echo "Your choice is ${1}" #注意哦,这里的${1}指的是函数printit的内建变量$1
}
case ${1} in
"one")
printit 1 #请注意,printit指令后面还有接参数
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac
写好后运行一下,我们会惊奇得发现
执行sh show123-3.sh one
的结果竟然是 Your choice is 1
如果理解了函数的内建变量,就明白输出结果不是Your choice is one
的原因
因为 printit 的定义程序 echo "Your choice is ${1}"
翻译成人话就是 -- 打印 “Your choice is 'printit 的内建变量 $1‘”
第七行的1
,第十行的2
,第十三行的3
都作为 printit的内建变量 $1
被输出。
理解起来可能有些绕弯弯。。。