我的shell脚本在SunOS中有什么问题,在其他linux版本上运行良好



请有人确定我的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" = "" ]

EDIT2 :

:

if [ -z "$JAVA_HOME" ]

可能更好(参见@n)。米的回答).

检查空字符串的可移植方法是

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"];然后回答"是";菲在伯恩几个不同平台上的Shell提示符。Solaris说"测试":未知操作符==' AIX说'sh: ==:未知测试操作符' HP-UXsh:==:一个测试命令参数无效。IRIX说"是的"。(只是为了与众不同:))

其次,有可能sh不知道如何处理空字符串。一个老派的方法是将测试更改为

[ XX"$JAVA_HOME" = XX"" ]

这对我来说比较[XX/opt/jdk1.7.0_02 = XX]这是假的,而不是做一个空的右边的测试,在一些shell失败

相关内容

  • 没有找到相关文章