Quel est le problème avec mon script shell dans SunOS, fonctionne très bien sur d'autres saveurs de Linux

StackOverflow https://stackoverflow.com/questions/7832277

  •  27-10-2019
  •  | 
  •  

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 ==
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top