Cosa c'è di sbagliato nel mio script di shell in SunOS, funziona bene su altre versioni di Linux

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

  •  27-10-2019
  •  | 
  •  

Domanda

Qualcuno può identificare qual è il problema nel mio script di shell, funziona bene su altri sistemi Linux tranne che su Sunos di seguito è il mio output

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%

Nota . Sto utilizzando csh

<”Aggiorna

Ho cambiato "$JAVA_HOME" ovunque

ma ottengo ancora

drifter% ./run.sh
+ [ ! /home/ilma1/java16/java ]
+ [ /home/ilma1/java16/java ==  ]
./run.sh: test: unknown operator ==
È stato utile?

Soluzione

Probabilmente $JAVA_HOME non è impostato.Una variabile non impostata normalmente si espande in una stringa vuota, quindi questo:

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

è equivalente a questo:

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

che è un errore di sintassi.([ è un altro nome per il comando test; di solito è un collegamento simbolico.)

Prova a citare il nome della variabile:

if [ "$JAVA_HOME" == "" ]

E se imposti $JAVA_HOME in risposta al prompt, probabilmente vorrai export.(In realtà non ne sono sicuro; java dipende dall'impostazione di $JAVA_HOME?)

MODIFICA :

Ok, sembra che $JAVA_HOME sia stato impostato.

Per il comando test (o [), l'operatore di uguaglianza di stringa è =, non ==.

Prova:

if [ "$JAVA_HOME" = "" ]

EDIT2 :

Questo:

if [ -z "$JAVA_HOME" ]

è probabilmente migliore (vedi la risposta di @ n.m).

Altri suggerimenti

Il modo portatile per verificare la presenza di stringhe vuote è

if [ -n "%VAR" ]  #true if $VAR is non-empty

o

if [ -z "$VAR" ]  # true if $VAR is empty

È anche possibile utilizzare if [ "x$VAR" == "x" ].Questo modulo è utile per confrontare stringhe arbitrarie che potrebbero essere vuote, ad es.if [ "x$JAVA_HOME" == "x$SCALA_HOME" ].

Il formato if [ "$VAR" ] può fallire con alcune vecchie incarnazioni di shell, sebbene il moderno SunOS dovrebbe andare bene.

== non è un operatore in sh. Un singolo= è l'operatore di test conforme a posix.

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

Ho appena avuto questo problema su Solaris 10 e ho trovato un gran numero di informazioni in questo post di dieci anni: http://lists.infowares.com/archive/clug/2003-Febbraio /001849.html

Ho appena provato "if [" a "==" a "]; poi eco sì; fi 'alla Bourne prompt della shell su diverse piattaforme. Solaris ha detto 'test: operatore sconosciuto== 'AIX ha detto' sh:==: operatore di prova sconosciuto 'HP-UX ha detto "sh:==: un parametro del comando di test non è valido." IRIX ha detto "sì" (solo per essere diversi :))

In secondo luogo, è possibile che sh non sappia cosa fare con la tua stringa vuota. Un trucco della vecchia scuola consiste nel modificare il test in

[ XX"$JAVA_HOME" = XX"" ]

che per me confronta [XX / opt / jdk1.7.0_02= XX] che è falso, piuttosto che fare un test con un lato destro vuoto che fallisce in alcune shell.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top