0

请有人能找出我的 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 ==
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(or [) 命令,字符串相等运算符是=,而不是==

尝试:

if [ "$JAVA_HOME" = "" ]

编辑2

这个:

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 应该没问题,但这种形式可能会因一些较旧的 shell 化身而失败。

于 2011-10-20T07:34:49.023 回答
0

== 不是 sh 中的运算符。单个 = 是符合 posix 的测试运算符。

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

我刚刚在 Solaris 10 上遇到了这个问题,并在这篇已有十年历史的帖子中找到了大量信息:http: //lists.infowares.com/archive/clug/2003-February/001849.html

我刚试过'if [“a”==“a”]; 然后回显是;fi' 在几个不同平台上的 bourne shell 提示符下。Solaris 说'test: unknown operator ==' AIX 说'sh:==: unknown test operator' HP-UX 说'sh:==: A test command parameter is not valid'。IRIX 说“是”(只是为了与众不同:))

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

[ XX"$JAVA_HOME" = XX"" ]

对我来说,比较 [ XX/opt/jdk1.7.0_02 = XX ] 这是错误的,而不是用空的右手边进行测试,这在某些 shell 中失败。

于 2013-02-28T01:19:25.787 回答