2013-09-21 49 views
1

我在我的腳本中使用getopts,我想爲它解決所有選項解析的順序。getopts用於標誌和選項解析

./myscript -c server 
./myscript -c -h server 
./myscript server -c 
./myscript -h server -c 
./myscript server 

我正在使用myscript如下。

#!/bin/bash 
while getopts c:h: var 
do 
case $var in 
h) host=$OPTARG;; 
c) FLAG=1 
esac 
done 

這裏的「服務器」是一個參數,應該載入甚至-h選項指定與否,也-c選項我使用了FLAG.Is有沒有辦法得到這個實現。

+0

是的,你的腳本喜歡什麼?你有沒有試圖寫任何東西?問題是什麼? – dan3

回答

1

有時,最好不要使用getopts都:

#!/bin/bash 

while [[ $# -gt 0 ]]; do 
    case "$1" in 
    -c) 
     FLAG=1 
     ;; 
    -h) 
     HOST=$2 
     shift 
     ;; 
    -*) 
     echo "Unknown option: $1" 
     exit 1 
     ;; 
    *) 
     HOST=$1 
     ;; 
    esac 
    shift 
done 

順便說一句,因爲你錯過了兩個分號腳本會給你一個語法錯誤:

c) FLAG=1 ;; 
+0

是的你是正確的,我錯過了輸入腳本的語法。由於我的腳本需要更多參數,所以我按照自己的回答製作了腳本。感謝您的幫助。 –

+1

你的答案比我的更完美。謝謝。 –

+0

@SriharshaKalluru當然歡迎:) – konsolebox

1

我固定我的問題通過申請一些額外的驗證..

#!/bin/bash 

USAGE() { 
     echo "Invalid Option" 
     exit 1 
} 

if [ $# -eq 2 ]; then 
       case $1 in 
         -c) FLAG=1; host=$2 ;; 
         -h) host=$2 ;; 
       esac 
       if [ -z "$host" ]; then 
       case $2 in 
         -c) FLAG=1; host=$1;; 
         -h) host=$1;; 
         *) USAGE;; 
       esac 
       fi 
     else 

     while getopts q:c:h: OPTION 
     do 
      case ${OPTION} in 
       q) USAGE;; 
       h) host=$OPTARG;; 
       c) FLAG=1 ;; 
       *)USAGE;; 
      esac 
     done 
fi 

if [ $# -eq 1 ]; then host=$1 ;fi 

echo Host = $host FLag = $FLAG 

在所有情況下我得到如此輸出中所示,在我的腳本中處理主機。

$ ./myscript.sh server1 
Host = server1 FLag = 
$ ./myscript.sh -c server1 
Host = server1 FLag = 1 
$ ./myscript.sh server1 -c 
Host = server1 FLag = 1 
$ ./myscript.sh server1 -h 
Host = server1 FLag = 
$ ./myscript.sh -h server1 
Host = server1 FLag =