getopt使用例子
绝大多数脚本使用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
muahao@aliyun.com