2013-01-22 63 views
2

我有應該運行的這兩個中的任何一個腳本:殼牌getops爲搶奪參數

script.sh -t TYPE 
script.sh -t TYPE -f FILE 
  • 如果沒有-t標誌我希望它錯誤並退出運行。
  • 如果運行了-t標誌我想抓住的價值,如果它與-f標誌我運行它存儲在名爲「$ TYPE」和打印「JUST $ TYPE」
  • 一個 變量想把它搶值,並將其存儲在一個名爲 「$ FILE」,並打印「$ TYPE和$ FILE」

從信息和教程都在這裏和互聯網一般變量,這是最接近我能得到。任何人都可以幫我把第二個條件放到這個現有的代碼中嗎?

while getopts ":t:" opt; do 
    case $opt in 
    a) 
     echo "JUST $OPTARG" >&2 
     ;; 
    \?) 
     echo "Error - Invalid type argument" >&2 
     exit 1 
     ;; 
    :) 
     echo "Error - No type argument" >&2 
     exit 1 
     ;; 
    esac 
done 

回答

2

看一看這樣的:

TYPE="" 
FILE="" 

while getopts "t:f:" opt; do 
    case $opt in 
     t) TYPE="$OPTARG" 
      ;; 
     f) FILE="$OPTARG" 
      ;; 
    esac 
done 

if [ -z "$TYPE" ]; then 
    echo "No -t. Bye." 
    exit 1 # error 
else 
    if [ -n "$FILE" ]; then 
    echo "$TYPE and $FILE" 
    else 
    echo JUST $TYPE 
    fi 
fi 
4

我想你會感到困惑,你應該如何處理命令行參數。

常用的方法是所有參數的處理先於程序/腳本的實際工作。

更多(與getopts有關)如果一個選項被冒號附加,表明該選項預計有一個參數。

您的case聲明看起來過多。您不需要測試冒號和問號。整個測試可以while循環後放


我會做這樣的

#!/bin/bash 
unset TYPE 
unset FILE 

#uncomment if you want getopts to be silent 
#OPTERR=0 

while getopts "t:f:" opt; do 
    case $opt in 
    t) 
     TYPE=$OPTARG 
     echo "JUST $OPTARG" 
     ;; 
    f) 
     FILE=$OPTARG 
     ;; 
    esac 
done 

if ! test "$TYPE" ; then 
    echo "-t is obligatory" 
    exit 1 
fi 

if test "$TYPE" && test "$FILE" ; then 
    echo "$TYPE and $FILE" 
fi 
+0

非常感謝你的幫助。這是否也適用於#!/ bin/sh? – Jimmy

+0

我不知道'/ bin/sh'後面有什麼shell,但是我會嘗試它。 – user1146332

+0

嚴格來說,沒有。不過,有一個外部程序'getopt',可以用來處理選項,如果你的shell不支持'getopts'命令的話。 – chepner