Что не так с моим сценарием оболочки в SunOS, отлично работает на других вкусах Linux - PullRequest
0 голосов
/ 20 октября 2011

Пожалуйста, кто-нибудь может определить, в чем заключается проблема в моем скрипте оболочки, он отлично работает на других системах 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 ==

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

Возможно $JAVA_HOME не установлено. Неназначенная переменная обычно расширяется до пустой строки, так что это:

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

эквивалентно этому:

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

, что является синтаксической ошибкой. ([ - это другое имя команды test; обычно это символическая ссылка.)

Попробуйте заключить в кавычки имя переменной:

if [ "$JAVA_HOME" == "" ]

И если вы установите $JAVA_HOME в ответ на приглашение, вы, вероятно, захотите export. (На самом деле я не уверен в этом; зависит ли java от установленной $JAVA_HOME)

EDIT

Хорошо, похоже, $JAVA_HOME установлено.

Для команды test (или [) оператор равенства строк равен =, а не ==.

Попробуйте:

if [ "$JAVA_HOME" = "" ]

EDIT2

Это:

if [ -z "$JAVA_HOME" ]

, вероятно, лучше (см. Ответ @ n.m).

1 голос
/ 20 октября 2011

Портативный способ проверки пустых строк:

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" ].

Th форма if [ "$VAR" ] может не работать с некоторыми более старыми воплощениями оболочки, хотя современная SunOS должна быть в порядке.

0 голосов
/ 28 февраля 2013

== не является оператором в sh. Single = - это тестовый оператор, совместимый с posix

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

Я только что столкнулся с этой проблемой в Solaris 10 и обнаружил отличную информацию в этом десятилетнем посте: http://lists.infowares.com/archive/clug/2003-February/001849.html

Я только что попробовал 'if ["a" == "a"]; тогда эхо да; фи в борне приглашение оболочки на нескольких разных платформах. Солярис сказал: «Тест: неизвестный оператор == 'AIX сказал' sh: ==: неизвестный тестовый оператор 'HP-UX сказал 'sh: ==: Параметр команды теста недопустим.' IRIX сказал «да» (просто чтобы быть другим :))

Во-вторых, возможно, sh не знает, что делать с вашей пустой строкой. Взлом старой школы - сменить тест на

[ XX"$JAVA_HOME" = XX"" ]

который для меня сравнивает [XX / opt / jdk1.7.0_02 = XX], который является ложным, вместо того, чтобы делать тест с пустой правой частью, которая не проходит в некоторых оболочках.

...