绝大多数脚本使用getopts应该就可以满足需求了,如果需要支持长选项以及可选参数,那么就需要使用getopt了.
getopt和getopts类似,也是通过冒号来区分选项是否接受参数值,其定义如下:
后面没有冒号,表示选项不接参数
后面有一个冒号,表示选项必须接参数
后面有两个冒号,表示选项参数可选
我们来看一下这个命令
example.sh -a -b value2 –argv3 value3
我们看到这个命令有两个短选项和一个长选项,分别是-a,-b和–argv3,其中a不接收参数,b和argv3接收参数,我们看一下如何在脚本里面进行定义
ARGS=`getopt -o ab: -l “argv3:,help” — “$@”`
eval set — “${ARGS}”
因为getopt是一个独立的程序,所以我们使用“来进行getopt的执行和结果获取,并通过eval set将规范化后的命令行参数分配至位置参数(1,1,2,…)
其中-o或–options选项后面接可接受的短选项;-l或–long选项后面接可接受的长选项,用逗号分开
一个完整的示例脚本如下:
#!/bin/bash
ARGS=`getopt -o ab: -l “argv3:,help” — “$@”`
eval set — “${ARGS}”
while true;
do
case “$1” in
-a)
echo “i am a”
shift
;;
-b)
echo “i am b, my value is $2”
shift 2
;;
–argv3)
echo “i am argv3, my value is $2”
shift 2
;;
–help)
echo “i am help info”
exit 0
;;
–)
shift
break
;;
*)
echo “Internal error!”
exit 1
;;
esac
done
if [[ $# -eq 0 ]];then
USAGE
fi
ARGS=`getopt -o d: -l “prepare,cleanup,ip:,sleep:,help” — “$@”`
eval set — “${ARGS}”
while true;
do
case “$1” in
–prepare)
echo “prepare”
ENV_PREPARE
exit 0
;;
–cleanup)
echo cleanup
ENV_CLEAN
exit 0
;;
–ip)
SERVER_IP=$2
shift 2
;;
–sleep)
SLEEP_TIME=$2
shift 2
;;
–help)
USAGE
exit 0
;;
-d)
DO_CASE $2
if [[ $? -eq 0 && ! -z $SLEEP_TIME ]];then
#只有server需要获取结果
GET_RESULT
fi
shift 2
;;
–)
shift
break
;;
*)
echo “Internal error!”
exit 1
;;
esac
done
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217454.html原文链接:https://javaforall.net
