2011-08-11 26 views
8

我想了解if else聲明sh腳本SH/bash的,如果else語句

所以我寫了下面找出是否JAVA_HOME是在環境中設置或不,我寫了下面的腳本

#!/bin/sh 
if [ $JAVA_HOME != "" ] 
then 
    echo $JAVA_HOME 
else 
    echo "NO JAVA HOME SET" 
fi 

這是我輸出到env

sh-3.2$ env 

SHELL=/bin/csh 
TERM=xterm 
HOST=estilor 
SSH_CLIENT=10.15.16.28 4348 22 
SSH_TTY=/dev/pts/18 
USER=asimonraj 
GROUP=ccusers 
HOSTTYPE=x86_64-linux 
PATH=/usr/local/bin:/bin:/home/asimonraj/java/LINUXJAVA/java/bin:/usr/bin 
MAIL=/var/mail/asimonraj 
PWD=/home/asimonraj/nix 
HOME=/home/asimonraj 
SHLVL=10 
OSTYPE=linux 
VENDOR=unknown 
LOGNAME=asimonraj 
MACHTYPE=x86_64 
SSH_CONNECTION=100.65.116.248 4348 100.65.116.127 22 
_=/bin/env 

,但我得到下面輸出

sh-3.2$ ./test.sh 
./test.sh: line 3: [: !=: unary operator expected 
NO JAVA HOME SET 

回答

13

你正在運行成sh擴展參數的方式一個愚蠢的限制。腳本的3號線被擴展爲:

if [ != ] 

哪個sh想不出做什麼用的。試試這個討厭的黑客對大小:

if [ x$JAVA_HOME != x ] 

兩個參數都必須是非空的,所以我們就拋出一個x到兩個人身上,看看會發生什麼。

可替代地,還有用於測試單獨的操作者一個字符串是否非空:(-z測試如果以下字符串是空的)

if [ !-z $JAVA_HOME ] 

+6

'if [「$ JAVA_HOME」!=「」]'也應該有效。 –

+0

@Keith Thompson:@diskwuff描述了這裏的標準約定。它也適用於'$ JAVA_HOME'被設置爲'test'會阻塞的其他事物,但我注意到'bash'非常寬鬆。 – reinierpost

+0

@reinierpost:你是​​說「x」前綴是標準約定嗎?這可能是一次,但我認爲這不是必要的,我很少看到它。操作數不一定非空,它們只需要是單個「單詞」(其中一個單詞可以是空字符串)。 (這可能是因爲一些非常古老的炮彈根本沒有區分''''的參數和根本沒有參數,但是如果目前普遍使用的任何炮彈都有這個問題,我會感到驚訝的。) –

1
if [ -z $JAVA_HOME ] 
then 
    echo $JAVA_HOME 
else 
    echo "NO JAVA HOME SET" 
fi 
+0

檢查這裏http://tldp.org/LDP/abs/html/comparison-ops .html – Kracekumar

+0

[使用四個空格縮進代碼塊](http://stackoverflow.com/editing-help#code),它使它們更易於閱讀。 (或者只是突出顯示代碼,然後單擊「{}」按鈕。) – OverZealous

+0

@OverZealous:我嘗試過,但即使按4倍空格鍵也無法工作,在輸出預覽中找不到任何更改。 – Kracekumar

1

-n-z是測試應該這裏使用:

if [ -n "$JAVAHOME" ]; then 
    echo "$JAVAHOME"; 
else 
    echo "\$JAVAHOME not set"; 
fi 
+0

我建議使用單引號而不是雙引號,並在不希望擴展發生的情況下轉義。否則,看起來不錯。 –

1

請注意,如果你想確定是否設置了變量,你可能不會t使用if/else或test([)。這是比較典型的做的事情,如:

 
# Abort if JAVA_HOME is not set (or empty) 
: ${JAVA_HOME:?JAVA_HOME is unset} 

 
# report the value of JAVA_HOME, or a default value 
echo ${JAVA_HOME:-default value} 

 
# Assign JAVA_HOME if it is unset (or empty) 
: ${JAVAHOME:=default value} 
+0

回聲情況需要更多引號。否則,這是迄今爲止我在這裏看到的最好答案(缺乏質量有點令人沮喪)。 –

+0

如果JAVA_HOME包含帶空格的路徑元素,那麼系統的問題比用雙引號解決的問題多! –

+0

僅僅因爲選擇一個文件名或位置來觸發bug程序中的錯誤是一種不好的做法,這對於那些程序來說是錯誤的。 –