Shell 獲取參數的方式


 

Shell 獲取參數的方式

寫shell腳本的時候,往往需要從外部獲取參數,例如:

$ sh demo.sh a

那么如何將上面的參數a傳到shell程序里面呢。
最常用的是,$0 $1... $10,這些位置變量 其中$0是shell程序的名字,$1,$2...分別為第一個參數,第二個參數... 我們demo.sh 如下所示:

$ cat demo.sh
#! /bin/bash

cat << EOF
     Usage: sh $0 $1
EOF

$ sh demo.sh a
 Usage: sh demo.sh a

$開頭的參數有:

$0: 程序的名字
$#: 變量的個數
$@:所有的變量,即:$1...$最后,不包括程序的名字

這有一個問題,當參數很多的時候,別人用你的程序時,交互性不是很好,別人還得記住腳本每一個參數的位置和作用,會很麻煩。這時可以加提示符:例如

$ sh demo.sh -a A -b B -c C 

那這個怎么實現呢? 實現的方式有兩種 利用shiftgetopts

$ cat demo.sh 
#! /bin/bash

while [ $# -gt 0 ];
do
   case $1 in
   -a) echo "-a----$2"
       shift
       ;;
   -b) echo "-b----$2"
       shift
       ;;
   -c) echo "-c----$2"
       shift
       ;;
   esac
   shift
done

$ sh demo.sh -a A -b B -c C
-a----A
-b----B
-c----C

getopts函數則簡化上面的選項處理過程。我們下面來看看它的使用方法。
函數的第一個參數:合法選項字母的一個字符串, 如果字母后面后·:則表示必須要提供參數,這時getopts函數會將參數放到OPTARG中,另外一個變量是OPTIND代表下一個待處理參數的索引值。
函數的第二個參數:變量名稱,每次getopts被調用的時候,都會被更新,這個變量名字是沒有限制的。getopts在找不到合法的選項的時候會將這個變量設置為一個問號。具體的實現如下所示:

#! /bin/bash
while getopts a:b:c: opt;
do
case $opt in
a) echo "-a ---- $OPTARG"
   ;;
b) echo "-b ---- $OPTARG"
   ;;
c) echo "-c ---- $OPTARG"
   ;;
?) echo "$opt is an invalid option"
   ;;
esac
done

$ sh demo.sh -a A -b B -c C -d
-a ---- A
-b ---- B
-c ---- C
demo.sh: illegal option -- d      --getopts輸出的錯誤信息
? is an invalid option            --腳本判斷輸出的錯誤信息,這里將-d option設置為了? 

但是getopts並不能處理長選項,這時可以借助getopt,大家可以man一下:

NAME
getopt - parse command options (enhanced)

從基本解釋可以看出,它是一個加強版的getopts,雖然getopts比它還多了一個s,但是論功力,還是遠遠不如getopt。這里有一個官網的例子:http://software.frodo.looijaard.name/getopt/docs/getopt-parse.bash。為了保持隊形,稍微改寫成解析-a -b -c --apple --banana --cat的demo.

$ cat demo_getopt.sh 
#! /bin/bash

TEMP=$(getopt -o ab:c:: --long apple,banana:,cat:: -- "$@")
if [ "$?" != "0" ]; then
    echo "Terminating..." >&2;
    exit 1
fi

eval set -- "$TEMP"    用"$TEMP"參數--前的字符串重置$1.$2.$3.$4...
echo $TEMP 

while true; do         解析$1.$2.$3.$4...
    case "$1" in
        -a|--apple) echo "Option $1, no argument"; shift 2;;
        -b|--banana) echo "Option $1 --> $2"; shift 2;;
        -c|--cat) 
            case "$2" in
                "") echo "Option $1, no argument"; shift 2;;
                *) echo "Option $1 --> $2"; shift 2;; 
            esac ;; 
        "--") shift; break;;
        *) echo "Internal error!"; exit 1;;
    esac
done

echo "Remaining arguments:"

for arg in $@; do
    echo '-->' "$arg"
done

其中

option ,表示后面不能跟參數
option:,表示后面必須接參數
option::,表示后面可接可不接

運行結果

$ sh demo_getopt.sh -a -b B -cC --apple --banana B testa testb
-a -b 'B' -c 'C' --apple --banana 'B' -- 'testa' 'testb' 這是getopt解析的結果
Option -a, no argument
Option -b --> B
Option -c --> C
Option --apple, no argument
Option --banana --> B
Remaining arguments:
--> testa
--> testb

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM