絕大多數腳本使用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
