簡體   English   中英

我在SunOS中的shell腳本出了什么問題,可以在其他Linux版本上正常運行

[英]What is wrong with my shell script in SunOS, runs fine on other linux flavours

請問有人可以確定我的shell腳本出了什么問題,它在其他Linux系統上可以正常工作,但下面的Sunos才是我的輸出

drifter% cat run.sh
#!/bin/sh -x
if [ ! $JAVA_HOME ] || [ $JAVA_HOME == "" ]
then
    echo Enter path to JAVA HOME:
    read JAVA_HOME
fi

if [ ! -f $JAVA_HOME/bin/java ]
then
echo "JAVA_HOME variable does not point to a valid java instance"
exit 1
fi

echo "Using JAVA_HOME: "$JAVA_HOME
JAVA_BIN=$JAVA_HOME/bin
ver=`$JAVA_HOME/bin/java -version 2>&1 | head -1 | awk '{print $NF}' | cut -d'.' -f2`

if [ $ver -ge 5 ]
then
    JAVA_LIB=`pwd`/lib
    export JAVA_LIB

    $JAVA_BIN/java -cp ./lib/a-jdbc-sqlserver-4.2.1.jar:./lib/a-jdbc-db2-4.2.1.jar:./lib/ilmInit.jar:./lib/db2jcc.jar:./lib/db2jcc_license_cisuz.jar:./lib/db2jcc_license_cu.jar:./lib/csm-runtime-1.0.jar:./lib/csm-dbutil-1.0.jar:./lib/classes12_g.jar:./lib/commons-beanutils-1.8.3.jar:./lib/commons-cli-1.2.jar:./lib/commons-exec-1.1.jar:./lib/log4j-1.2.8.jar:./lib/groovy-all-1.8.1.jar -Dlog4j.configuration=com/a/csm/log4j.xml -Dendorsed_plugins_dir=./plugins InitValues $@

else
    echo Current JDK $ver
    echo "Expected JDK 1.5 or later. Please fix your JAVA HOME and try again."
    exit 1
fi
drifter% ./run.sh
+ [ ! ]
./run.sh: test: argument expected
drifter%

注意 :我正在使用csh

更新資料

我到處都改變了"$JAVA_HOME"

但我仍然得到

drifter% ./run.sh
+ [ ! /home/ilma1/java16/java ]
+ [ /home/ilma1/java16/java ==  ]
./run.sh: test: unknown operator ==

$JAVA_HOME可能未設置。 未設置的變量通常會擴展為空字符串,因此:

if [ ! $JAVA_HOME ] || [ $JAVA_HOME == "" ]

等效於此:

if [ ! ] || [ == "" ]

這是語法錯誤。 [test命令的另一個名稱;通常是符號鏈接。)

嘗試引用變量名稱:

if [ "$JAVA_HOME" == "" ]

並且如果您設置$JAVA_HOME來響應該提示,則可能要export它。 (實際上我不確定; java取決於$JAVA_HOME的設置?)

編輯

好的,看起來$JAVA_HOME已設置。

對於test (或[ )命令,字符串相等運算符為= ,而不是==

嘗試:

if [ "$JAVA_HOME" = "" ]

編輯2

這個:

if [ -z "$JAVA_HOME" ]

可能更好(請參閱@nm的答案)。

檢查空字符串的便攜式方法是

if [ -n "%VAR" ]  #true if $VAR is non-empty

要么

if [ -z "$VAR" ]  # true if $VAR is empty

也可以使用if [ "x$VAR" == "x" ] 此形式對於比較可能為空的任意字符串很有用,例如, if [ "x$JAVA_HOME" == "x$SCALA_HOME" ]

if [ "$VAR" ]可以用一些舊版本的shell失敗,盡管現代的SunOS應該可以。

==不是sh中的運算符。 單個=是posix兼容的測試運算符。

if [ ! $JAVA_HOME ] || [ $JAVA_HOME = "" ]

我剛剛在Solaris 10上遇到了這個問題,並在此已有十年歷史的帖子中發現了很多信息: http : //lists.infowares.com/archive/clug/2003-February/001849.html

我只是試過'if [“ a” ==“ a”]; 然后回聲是; 在幾種不同平台上的bourne shell提示符下顯示fi'。 Solaris表示“測試:未知運算符==” AIX表示“ sh:==:未知測試運算符” HP-UX表示“ sh:==:測試命令參數無效”。 IRIX說“是”(只是有所不同:))

其次,sh可能不知道如何處理空字符串。 一個老派的技巧是將您的測試更改為

[ XX"$JAVA_HOME" = XX"" ]

對我來說,它比較[XX / opt / jdk1.7.0_02 = XX],這是錯誤的,而不是用空的右側進行測試,該測試在某些外殼中失敗了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM