#!/bin/bash
while getopts "a:" opt; do
case $opt in
a)
echo "this is -a the arg is ! $OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG"
;;
esac
done
在使用的時(shí)候就是
./test.sh -a hello
選項(xiàng)之間可以通過冒號(hào) : 進(jìn)行分隔,也可以直接相連接蔫耽,
: 表示選項(xiàng)后面必須帶有參數(shù)筹误,如果沒有可以不加實(shí)際值進(jìn)行傳遞
例如:getopts ahfvc: option表明選項(xiàng)a、h、f进肯、v可以不加實(shí)際值直接使用,而選項(xiàng)c必須在后面帶上值棉磨。使用選項(xiàng)取值時(shí)江掩,必須使用變量OPTARG保存該值。
而在
while getopts "a:" opt; do
中選項(xiàng)a前面有沒有: 則決定的是
(1)前面帶有: 輸入-a但是參數(shù)為空不報(bào)錯(cuò)乘瓤,會(huì)被忽略
(2)前面沒有: 參數(shù)為空?qǐng)?bào)錯(cuò)
在使用getopts命令的時(shí)候频敛,shell會(huì)自動(dòng)產(chǎn)生兩個(gè)變量OPTIND和OPTARG。
一馅扣、shift參數(shù)的使用
很多腳本執(zhí)行的時(shí)候我們并不知道后面參數(shù)的個(gè)數(shù)斟赚,但可以使用$*來獲取所有參數(shù)。但在程序處理的過程中有時(shí)需要逐個(gè)的將$1差油、$2拗军、$3……$n進(jìn)行處理,shift命令的作用就是在執(zhí)行完$1后蓄喇,將$2變?yōu)?1发侵,$3變?yōu)?2,依次類推妆偏。
#!/bin/bash
until [ $# -eq 0 ]
do
echo "第一個(gè)參數(shù)為: $1 參數(shù)個(gè)數(shù)為: $#"
shift
done
輸出為
第一個(gè)參數(shù)為: 1 參數(shù)個(gè)數(shù)為: 4
第一個(gè)參數(shù)為: 2 參數(shù)個(gè)數(shù)為: 3
第一個(gè)參數(shù)為: 3 參數(shù)個(gè)數(shù)為: 2
第一個(gè)參數(shù)為: 4 參數(shù)個(gè)數(shù)為: 1
getopts參數(shù)的使用
#!/bin/bash
echo $*
while getopts ":a:bc:" opt
do
case $opt in
a)
echo $OPTARG $OPTIND;;
b)
echo "b $OPTIND";;
c)
echo "c $OPTIND";;
?)
echo "error"
exit 1;;
esac
done
echo $OPTIND
shift $(( $OPTIND-1 ))
echo $0
echo $*
執(zhí)行結(jié)果如下
[root@localhost ~]# sh getopts.sh -a 11 -b -c 6
-a 11 -b -c 6
11 3
b 4
c 6
6
getopts.sh
while getopts ":a:bc:" opt #第一個(gè)冒號(hào)表示忽略錯(cuò)誤刃鳄;字符后面的冒號(hào)表示該選項(xiàng)必須有自己的參數(shù)。
$optarg 存儲(chǔ)相應(yīng)選項(xiàng)的參數(shù)钱骂,如上例中的11叔锐、6挪鹏;
$optind 總是存儲(chǔ)原始$*中下一個(gè)要處理的選項(xiàng)(不是參數(shù),而是選項(xiàng),此處指的是a,b,c這三個(gè)選項(xiàng),而不是那些數(shù)字愉烙,當(dāng)然數(shù)字也是會(huì)占有位置的)位置讨盒。
optind初值為1,遇到"x"步责,選項(xiàng)不帶參數(shù)返顺,optind+=1;遇到"x:"蔓肯,帶參數(shù)的選項(xiàng)遂鹊,optarg=argv[optind+1],optind+=2蔗包;遇到"x::"秉扑,可選參數(shù),屬于#1和#2之一(轉(zhuǎn)載過來的气忠,這句我也看不懂)
第一行輸出echo $*
第二行,optind初值為1赋咽,選項(xiàng)-a的參數(shù)為11旧噪,下一個(gè)要處理的選項(xiàng)-b位置為3,所以輸出:11 3脓匿;
第三行淘钟,然后-b要處理的下一個(gè)選項(xiàng)-c位置為4,所以輸出:b 4陪毡;
第四行米母,再者-c有參數(shù),所以下一個(gè)要處理的位置+2毡琉,所以輸出:c 6铁瞒;