有人可以确定我的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 ==
答案 0 :(得分: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" ]
可能更好(参见@n.m的回答)。
答案 1 :(得分: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" ]
。
虽然现代的SunOS应该没问题,但if [ "$VAR" ]
形式可能会失败,但是现有的SunOS应该没问题。
答案 2 :(得分:0)
==不是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-UX 说'sh:==:测试命令参数无效。' IRIX说'是' (只是为了与众不同:))
其次, sh可能不知道如何处理空字符串。老派黑客将你的考试改为
[ XX"$JAVA_HOME" = XX"" ]
对我来说比较[XX / opt / jdk1.7.0_02 = XX]这是假的,而不是在一些炮弹失败的情况下进行测试。