18-编写命令行工具
原创大约 3 分钟
不是太规范的写法:
#!/bin/bash
ACTION="$1"
EXPIRY="$2"
USER_TYPE="$3"
USER_NAME="$4"
# 打印解析的参数
echo "ACTION: $ACTION"
echo "EXPIRY: $EXPIRY"
echo "USER_TYPE: $USER_TYPE"
echo "USER_NAME: $USER_NAME"正规写法,使用 getopts 函数解析命令行参数
getopts optstring name [args]optstring: 一个字符串,定义了所有接受的选项。每个字母代表一个选项,如果该字母后面跟着冒号(:),则表示该选项需要一个参数。name: 一个变量名,通常为大写,getopts会将解析到的选项存入这个变量。[args]: 可选的,传递给脚本的其他参数。
while getopts "ADLe:t:u:" OPTION;这里,while循环与getopts结合使用,"ADLe:t:u:"是optstring,定义了接受的选项:
A,D,L是不需要参数的选项。只匹配最后一个。e:表示-e选项需要一个参数。t:同样,-t需要一个参数。u:-u也需要一个参数
#!/bin/bash
if [ $# -eq 0 ];then
echo "Usage: bash $0 (-A|-D|-L) -e (1h or more) -t (admin|view) -u boge"
exit 1
fi
# 默认值
ACTION=""
EXPIRY=""
USER_TYPE=""
USER_NAME=""
# 解析命令行参数
while getopts "ADLe:t:u:" OPTION; do
case $OPTION in
A)
ACTION="add-test $1"
;;
D)
ACTION="del-test $1"
;;
L)
ACTION="list-test $1"
;;
e)
EXPIRY="$OPTARG"
# 在Bash中,正则表达式匹配应该使用=~运算符(没有空格)
[[ $OPTARG =~ ^[1-9][0-9]*h$ ]] || { echo "'-e' must be set like '2h, 5h, 50000h, ...'"; exit 1; }
;;
t)
USER_TYPE="$OPTARG"
[[ $OPTARG =~ ^(admin|view)$ ]] || { echo "'-t' can only be set as 'admin' or 'view'"; exit 1; }
;;
u)
USER_NAME="$OPTARG"
;;
?)
echo "Invalid option: -$OPTARG"
exit 1
;;
esac
done
function add-test(){
# 打印解析的参数
echo "ACTION: $ACTION"
echo "EXPIRY: $EXPIRY"
echo "USER_TYPE: $USER_TYPE"
echo "USER_NAME: $USER_NAME"
}
function del-test(){
# 打印解析的参数
echo "ACTION: $ACTION"
echo "EXPIRY: $EXPIRY"
echo "USER_TYPE: $USER_TYPE"
echo "USER_NAME: $USER_NAME"
}
function list-test(){
# 打印解析的参数
echo "ACTION: $ACTION"
echo "EXPIRY: $EXPIRY"
echo "USER_TYPE: $USER_TYPE"
echo "USER_NAME: $USER_NAME"
}
${ACTION}
$OPTION存储当前解析到的选项字母。在while getopts循环中,$OPTION会依次取得每个传递给脚本的选项字母。例如,如果命令行参数是-A -e 2h -t admin -u username,那么在循环中$OPTION的值将依次为A、e、t、u。$OPTARG存储与当前选项相关联的参数的值。如果选项后面有冒号(如-e、-t、-u),那么$OPTARG就会存储该选项后面的参数值。如果选项没有提供参数,或者该选项后没有冒号,则$OPTARG为空。在上述例子中,当$OPTION的值为e时,$OPTARG的值将是2h;
# bash getopts-test.sh -D -e 1h -t admin -u hong
ACTION: del-test -D
EXPIRY: 1h
USER_TYPE: admin
USER_NAME: hong