2013-02-20 70 views
8

我有腳本,需要在用戶在執行腳本時丟失任何必需信息的情況下顯示使用情況命令。在沒有getopts的情況下在shell腳本中添加使用內容

Usage : Script -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value> 

了對來自參數如下變量時尚所有OPTIONS

我得到的值的解釋。但我想在shell腳本中使用驗證。

SERVER=$1 
INSTANCE=$2 
USER=$3 
DB_PASSWD=$4 
QUERY=$5 
VAL_WARN=$6 
VAL_CRIT=$7 

我一直在使用getopts的嘗試,但未能成功,因爲<query>使用經過前值不具有-q參數。

我試着找到其他所有的方法,但是所有人都建議getopts對我來說不是可行的解決方案。

請幫我在這..

+1

選項字母的優點之一是它允許用戶以任意順序放置項目。如果訂單是固定的,則無需打擾諸如'-s'的選項;這只是使用戶類型額外的基本沒有好處。我注意到原始命令行中的服務器字符串是'$ 2'(而不是'$ 1')。你不能調整你的命令,以便需要'-q',或者查詢是最後一個參數嗎?是否有任何選項具有合理的默認值?如果是這樣,請使用它們而不是要求用戶鍵入13個參數。您的用戶會感謝您,並且您的腳本將更易於編寫。 – 2013-02-21 02:00:30

回答

20

使用移通過所有的參數進行迭代,是這樣的:

#!/bin/sh 

usage() 
{ 
    echo 'Usage : Script -s <server> -i <instance> -u <user> -p <password>' 
    echo '     <query> -w <warning value> -c <critical value>' 
    exit 
} 

if [ "$#" -ne 13 ] 
then 
    usage 
fi 

while [ "$1" != "" ]; do 
case $1 in 
     -s)   shift 
         SERVER=$1 
         ;; 
     -i)   shift 
         INSTANCE=$1 
         ;; 
     -u)   shift 
         USER=$1 
         ;; 
     -p)   shift 
         PASSWORD=$1 
         ;; 
     -w)   shift 
         WARNINGVAL=$1 
         ;; 
     -c)   shift 
         CRITICVAL=$1 
         ;; 
     *)   QUERY=$1 
    esac 
    shift 
done 

# extra validation suggested by @technosaurus 
if [ "$SERVER" = "" ] 
then 
    usage 
fi 
if [ "$INSTANCE" = "" ] 
then 
    usage 
fi 
if [ "$USER" = "" ] 
then 
    usage 
fi 
if [ "$PASSWORD" = "" ] 
then 
    usage 
fi 
if [ "$QUERY" = "" ] 
then 
    usage 
fi 
if [ "$WARNINGVAL" = "" ] 
then 
    usage 
fi 
if [ "$CRITICVAL" = "" ] 
then 
    usage 
fi 

echo "ALL IS WELL. SERVER=$SERVER,INSTANCE=$INSTANCE,USER=$USER,PASSWORD=$PASSWORD,QUERY=$QUERY,WARNING=$WARNINGVAL,CRITIC=$CRITICVAL" 

應該做的伎倆。

編輯:在腳本添加參數驗證由@technosaurus

+0

只需在最後檢查'[! 「$ PASSWORD」] && usage' #and其他強制性參數類似 – technosaurus 2013-02-21 03:01:04

+0

@technosaurus AFAICS檢查已經存在:'while [「$ 1」!=「」] ...' – 2013-02-21 17:10:32

+0

這仍然可以工作'Script q q q q q q q q q q q q q'並且沒有任何所需值將被設置爲 – technosaurus 2013-02-21 18:42:21

1

getopts建議被婊子用於good reason。你應該改變腳本的界面以符合人們的期望。

或者,您可以使用getopts兩次,第一次用於query之前的選項,shift,然後用於其餘部分。

1

嘗試了這一點

usage() 
{ 
    echo "$0 -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value>" 
} 

for i in {0..12} 
do 
    arg=`expr $i +1` 
    test ! "${!arg}" && usage && break 
done 

希望這有助於

+1

或者你可以'爲我在{1..13}''並擺脫subshel​​l。 – 2013-02-21 01:27:29

0

這是一個非標準的做法,而是一個我覺得非常有用。與其將值作爲參數傳遞給特定標誌(這相當惱人;不應要求用戶指定每個值,但應提供合理的缺省值),您可以直接通過環境直接傳遞它們,以便典型的調用如:

SERVER=blah INSTANCE=foo Script 

這將是很好,如果您使用小寫變量名稱,因此用戶不必喊。這允許腳本完全避免分析命令行,因爲變量的值將在腳本開始時設置。

相關問題