一个计算机技术爱好者与学习者

0%

好好学Shell:脚本参数提示和校验

1. 需求描述

有一个脚本,需要appname、ip、hostname、domain四个参数,并且都不能为空。

2. 脚本实现

main.sh 脚本内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash

function usage(){
echo -e "-a -i -H -d are requierd
-a: appName
-i: ip
-h: hostname
-d: domain
"
}

checkOpts () {
local key=$1
local value=$2
[[ -z "${value}" ]] \
&& echo -e "\033[31mFATAL: ${key} should not be empty! \033[0m" \
&& usage \
&& return 1
return 0
}

function main(){
while getopts "a:i:H:d:" opt;do
case $opt in
a) appname=${OPTARG} && echo "appname=${appname}" ;;
i) ip=${OPTARG} && echo "ip=${ip}" ;;
H) hostname=${OPTARG} && echo "hostname=${hostname}" ;;
d) domain=${OPTARG} && echo "domain=${domain}" ;;
*) usage && exit 0 ;;
esac
done

read -p "确认参数无误,继续执行脚本?[Y/N]" input
if [[ $input = "y" || $input = "Y" ]];then
echo -e "\n------ continue... ------\n"
else
echo -e "\n------ exit ------\n"
exit 1
fi
! checkOpts "appname" ${appname} && exit 1
! checkOpts "ip" ${ip} && exit 1
! checkOpts "hostname" ${hostname} && exit 1
! checkOpts "domain" ${domain} && exit 1

# logic code
}

main "$@"

问题来了,如果想要添加参数怎么办?最简单的思路就是修改getopts部分,添加新的参数。

这里提供另外一个思路:提前留出一个other变量,用来接收多出的参数,这个other变量可以拆分成多个子变量,这样就具备了更好的通用性。