Quel est le problème avec mon script shell dans SunOS, fonctionne très bien sur d'autres saveurs de Linux
Question
S'il vous plaît quelqu'un peut identifier ce qui est le problème dans mon script shell, il fonctionne très bien sur d'autres systèmes Linux sauf SunOS ci-dessous est ma sortie
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%
Remarque : J'utilise csh
Mise à jour
J'ai changé "$JAVA_HOME"
partout
mais je reçois
drifter% ./run.sh
+ [ ! /home/ilma1/java16/java ]
+ [ /home/ilma1/java16/java == ]
./run.sh: test: unknown operator ==
La solution
Probablement $JAVA_HOME
n'est pas réglé. Une variable non durci se développe normalement à une chaîne vide, de sorte que celle-ci:
if [ ! $JAVA_HOME ] || [ $JAVA_HOME == "" ]
est équivalent à ceci:
if [ ! ] || [ == "" ]
ce qui est une erreur de syntaxe. ([
est un autre nom pour la commande test
;. Il est généralement un lien symbolique)
Essayez de citer le nom de la variable:
if [ "$JAVA_HOME" == "" ]
Et si vous définissez $JAVA_HOME
en réponse à l'invite, vous voulez probablement export
il. (En fait, je ne suis pas sûr de cela, ne dépend java
ensemble étant de $JAVA_HOME
?)
EDIT :
Ok, on dirait $JAVA_HOME
a été défini.
Pour la commande test
(ou [
), l'opérateur d'égalité de chaîne est =
, pas ==
.
Essayez:
if [ "$JAVA_HOME" = "" ]
EDIT2 :
if [ -z "$JAVA_HOME" ]
est probablement mieux (voir @ réponse de N.m).
Autres conseils
La façon portable pour vérifier les chaînes vides est
if [ -n "%VAR" ] #true if $VAR is non-empty
ou
if [ -z "$VAR" ] # true if $VAR is empty
Il est également possible d'utiliser if [ "x$VAR" == "x" ]
. Cette forme est utile de comparer chaîne arbitraire qui pourrait être vide, par exemple if [ "x$JAVA_HOME" == "x$SCALA_HOME" ]
.
Th forme if [ "$VAR" ]
peut échouer avec certaines anciennes incarnations de la coquille, bien que SunOS moderne devrait être OK.
== n'est pas un opérateur sh. Un seul = est l'opérateur de test conforme posix.
if [ ! $JAVA_HOME ] || [ $JAVA_HOME = "" ]
Je viens de ce problème sur Solaris 10, et a trouvé un grand snipped d'informations dans cet ancien poste de dix ans: http://lists.infowares.com/archive/clug/2003-February /001849.html
Je viens d'essayer « si [ "a" == "a"]; then echo oui; fi » au bourne invite du shell sur plusieurs plates-formes différentes. Solaris dit « test: opérateur inconnu == » AIX dit 'sh: ==: opérateur de test inconnu HP-UX ledit « sh: ==: un paramètre de commande de test est non valide. » IRIX dit « oui » (Juste pour être différent :))
En second lieu, il est possible que sh ne sait pas quoi faire avec votre chaîne vide. Une astuce vieille école est de changer votre test à
[ XX"$JAVA_HOME" = XX"" ]
qui me compare [XX / opt / jdk1.7.0_02 = XX] ce qui est faux, plutôt que de faire un test avec un côté droit vide qui échoue dans quelques coquilles.