2011-06-29 52 views
1

我正在嘗試編寫一個採用選項的bash腳本。 我們稱這些選項爲A和B.將Bash命令行選項轉換爲變量名稱

在腳本A和B中可能會或可能不會被定義爲變量。

我希望能夠檢查變量是否定義。

我已經嘗試了以下,但它不起作用。

if [ ! -n $1 ]; then 
    echo "Error" 
fi 

感謝

+0

請問這個問題的幫助:http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options – Dave

回答

0

不要那樣做,試試這個:

if [[ -z $1 ]]; then 
    echo "Error" 
fi 

錯誤在你的版本實際上是引用缺乏
應該是:

if [ ! -n "$1" ]; then 
    echo "Error" 
fi 

但你並不需要否定,使用-z代替。

如果您使用Bash,則使用雙括號[[]]

-z string 
     True if the length of string is zero. 
-n string 
     True if the length of string is non-zero. 

另外,如果你使用bash V4或更高(bash --version)有-v

-v varname 
     True if the shell variable varname is set (has been assigned a value). 
0

你沒有定義如何:

man bash頁面

這些選項應該通過,但我認爲:

if [ -z "$1" ]; then 
    echo "Error" 
    exit 1 
fi 

是你在找什麼。

然而,如果一些選項是,呃,可選的,那麼你可能想是這樣的:

#!/bin/bash 
USAGE="$0: [-a] [--alpha] [-b type] [--beta file] [-g|--gamma] args..." 

ARGS=`POSIXLY_CORRECT=1 getopt -n "$0" -s bash -o ab:g -l alpha,beta:,gamma -- "[email protected]"` 
if [ $? -ne 0 ] 
then 
    echo "$USAGE" >&2 
    exit 1 
fi 
eval set -- "$ARGS" 
unset ARGS 

while true 
do 
    case "$1" in 
    -a) echo "Option a"; shift;; 
    --alpha) echo "Option alpha"; shift;; 
    -b) echo "Option b, arg '$2'"; shift 2;; 
    --beta) echo "Option beta, arg '$2'"; shift 2;; 
    -g|--gamma) echo "Option g or gamma"; shift;; 
    --) shift ; break ;; 
    *) echo "Internal error!" ; exit 1 ;; 
    esac 
done 

echo Remaining args 
for arg in "[email protected]" 
do 
    echo '--> '"\`$arg'" 
done 

exit 0 
1

「正確」的方式來測試一個變量是否被設置爲使用+擴展選項。你會看到在configure腳本這個有很多:

if test -s "${foo+set}" 

如果它被設置在那裏${foo+set}擴展到"set"""如果它不是。這可以讓變量設置爲空,如果你需要的話。 ${foo:+set}此外還要求$foo不能爲空。

(那$(eval echo $a)事情有問題:它很慢,而且它很容易受到代碼注入(!)的影響。)

噢,如果你只是想拋出一個錯誤,如果沒有設置所需的東西,你可以參考變量${foo:?}(離開:如果設置但空是允許的),或爲一個自定義錯誤消息${foo:?Please specify a foo.}

+0

我喜歡這和[PE](http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion)很好。這裏也只是想提一下,在我的回答中,bash v4 +(iirc)提供了'-v'測試來表示是否設置了一個變量。 – c00kiemon5ter