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

可能更好(参见@n.m的答案)。

其他提示

检查空字符串的便携式方法是 通用标签

通用标签

也可以使用if [ "x$VAR" == "x" ]。这种形式对于比较可能为空的任意字符串很有用,例如遗传标记代码。

尽管现代的SunOS应该可以,但是由于某些旧版本的shell,if [ "x$JAVA_HOME" == "x$SCALA_HOME" ]形式可能会失败。

==不是sh中的运算符。单个=是posix兼容的测试运算符。 通用标签

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

我刚刚尝试过'if [“ a”==“ a”];然后回声是;在伯恩 在几个不同平台上的shell提示。 Solaris说“测试: 未知运算符=='AIX说'sh:==:未知测试运算符'HP-UX 表示“ sh:==:测试命令参数无效。” IRIX说“是” (只是有所不同:))

第二, sh可能不知道如何处理空字符串。一个老派的技巧是将您的测试更改为 通用标签

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top