本文轉(zhuǎn)自:https://www.bbsmax.com/A/ZOJPrxqldv/
一荤西、說明
shell中獲取參數(shù)可以直接使用$1贺奠、$2等形式來獲取白胀,但這種方式有明顯的限制:每個參數(shù)的位置是固定的谅年。比如如果在設(shè)計上 $1是ip地址$2是端口稼病,那在執(zhí)行時就必須第一個參數(shù)是ip第二個參數(shù)是端口而不能反過來。
shell提供了getopt和getopts來解析參數(shù)良蛮,getopt比getopts功能強一些getopts比getopt簡單一些抽碌;總體而言getopt和getopts都差強人意。
二背镇、使用getopt解析參數(shù)
getopt比getopts強一些復(fù)雜一些:能在命令行中單獨使用咬展、支持長選項格式、支持選項值可選瞒斩。更多說明見注釋。
#/bin/bash
usage(){
echo “
Usage:
-i, --ip target server ip
-p, --port target service port
-h, --help display this help and exit
example1: testGetopt -i192.168.1. -p80
example2: testGetopt --ip=192.168.1.1 --port=
“
# 短格式中涮总,選項值為可選的選項胸囱,選項值只能緊接選項而不可使用任何符號將其他選項隔開;如-p80瀑梗,不要寫成性-p
# 短格式中烹笔,選項值為必有的選項裳扯,選項值既可緊接選項也可以使用空格與選項隔開;如-i192.168.1.谤职,也可寫成-i 192.168.1.1
# 長格式中饰豺,選項值為可選的選項,選項值只能使用=號連接選項允蜈;如--port=冤吨,不可寫成性--port80或--port
# 長格式中,選項值為必有的選項饶套,選項值既可使用=號連接選項也可使用空格連接選項漩蟆;如--ip=192.168.1.1,也可寫成--ip 192.168.1.1
# 為簡便起見妓蛮,建議凡是短格式都使用“選項+選項值”的形式(-p80)怠李,凡是長格式都使用“選項+=+選項值”的形式(--port=)
}
main(){
while true
do
case "$1” in
-i|--ip)
ip=“$2”
echo "ip: $ip”
shift
;;
-p|--port)
port=“$2”
echo "port: $port”
shift
;;
-h|--help)
usage
# 打印usage之后直接用exit退出程序
exit
;;
--)
shift
break
;;
*)
echo "$1 is not option”
;;
esac
shift
done
# 剩余所有未解析到的參數(shù)存在$@中,可通過遍歷$@來獲取
#for param in “$@“
#do
# echo "Parameter #$count: $param”
#done
}
# 如果只注冊短格式可以如下這樣子
# set -- $(getopt i:p::h "$@“)
# 如果要注冊長格式需要如下這樣子
# -o注冊短格式選項
# --long注冊長格式選項
# 選項后接一個冒號表示其后為其參數(shù)值蛤克,選項后接兩個冒號表示其后可以有也可以沒有選項值捺癞,選項后沒有冒號表示其后不是其參數(shù)值
set -- $(getopt -o i:p::h --long ip:,port::,help -- "$@“)
# 由于是在main函數(shù)中才實現(xiàn)參數(shù)處理,所以需要使用$@將所有參數(shù)傳到main函數(shù)
main $@
執(zhí)行結(jié)果:
參考:
https://blog.csdn.net/wh211212/article/details/53750366
http://yejinxin.github.io/parse-shell-options-with-getopt-command
三构挤、使用getopts解析參數(shù)
getopts比getopt弱一些簡單一些:不能在命令行中單獨使用髓介、不支持長選項格式、不支持選項值可選儿倒。更多說明見注釋版保。
#!/bin/bash
usage(){
echo “
Usage:
-i, --ip target server ip
-p, --port target service port
-h, --help display this help and exit
example1: ./testGetopts.sh -i192.168.1. -p80
example2: ./testGetopts.sh -i 192.168.1.1 -p
“
# getopts只能在shell腳本中使用,不能像getopt一樣在命令行中單獨使用
# getopts只支持短格式不支持長格式
# getopts如果設(shè)定有選項值的選項夫否,如果沒提供選項值那么會直接報錯
# getopts選項要么有選項值要么沒有選項值彻犁,沒有可有也可以沒有
# getopts選項后可緊接選項值,也可以使用空格隔開凰慈;為與getopt統(tǒng)一建議使用緊接格式
}
main(){
# 選項有:表示該選項需要選項值
while getopts "i:p:h” arg
do
case $arg in
i)
#參數(shù)存在$OPTARG中
ip=“$OPTARG”
echo "ip: $ip”
;;
p)
port=“$OPTARG”
echo "port: $port”
;;
h)
usage
# 打印usage之后直接用exit退出程序
exit
;;
?)
#當(dāng)有不認(rèn)識的選項的時候arg值為?
echo "unregistered argument”
exit
;;
esac
done
}
main $@
執(zhí)行結(jié)果:
參考:
https://www.cnblogs.com/FrankTan/archive/2010/03/01/1634516.html