0

誰かが私のシェルスクリプトの問題を特定できますか?それは他の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 ==
4

3 に答える 3

2

おそらく$JAVA_HOME設定されていません。未設定の変数は通常、空の文字列に展開されるため、次のようになります。

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

これと同等です:

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

これは構文エラーです。([はコマンドの別名testです。通常はシンボリックリンクです。)

変数名を引用してみてください。

if [ "$JAVA_HOME" == "" ]

そして、あなた$JAVA_HOMEがプロンプトに応じて設定するなら、あなたはおそらくそれをしたいと思うでしょうexport。(実際、私はそれを確信していません;設定javaに依存し$JAVA_HOMEますか?)

編集

設定されたよう$JAVA_HOMEです。

test(または)コマンドの場合[、文字列等価演算子は=、ではなく、==です。

試す:

if [ "$JAVA_HOME" = "" ]

EDIT2

これ:

if [ -z "$JAVA_HOME" ]

おそらくより良いです(@nmの答えを参照してください)。

于 2011-10-20T07:16:19.677 に答える
1

空の文字列をチェックするポータブルな方法は次のとおりです。

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" ]現代のSunOSは問題ないはずですが、この形式はシェルの古い化身では失敗する可能性があります。

于 2011-10-20T07:34:49.023 に答える
0

==はshの演算子ではありません。単一の=は、posix準拠のテスト演算子です。

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

Solaris 10でこの問題が発生したばかりで、この10年前の投稿で情報の抜粋を見つけました:http: //lists.infowares.com/archive/clug/2003-February/001849.html

'if ["a" == "a"]; 次に、yesをエコーし​​ます。いくつかの異なるプラットフォームでのbourneシェルプロンプトでのfi'。Solarisは「テスト:不明な演算子==」AIXは「sh:==:不明なテスト演算子」と述べましたHP-UXは「sh:==:テストコマンドパラメータが無効です」と述べました。IRIXは「はい」と言いました(ただ違うだけです:))

次に、shが空の文字列をどう処理するかを知らない可能性があります。昔ながらのハックは、テストをに変更することです

[ XX"$JAVA_HOME" = XX"" ]

これは、一部のシェルで失敗する空の右側でテストを実行するのではなく、falseである[XX / opt / jdk1.7.0_02=XX]を比較します。

于 2013-02-28T01:19:25.787 に答える