O que há de errado com meu script de shell no SunOS funciona bem em outros tipos de Linux

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

  •  27-10-2019
  •  | 
  •  

Pergunta

Por favor, alguém pode identificar qual é o problema no meu script de shell, ele funciona bem em outros sistemas Linux, exceto no Sunos abaixo é a minha saída

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%

Observação : estou usando csh

< Budapate

Eu mudei "$JAVA_HOME" em todos os lugares

mas ainda entendo

drifter% ./run.sh
+ [ ! /home/ilma1/java16/java ]
+ [ /home/ilma1/java16/java ==  ]
./run.sh: test: unknown operator ==
Foi útil?

Solução

Provavelmente $JAVA_HOME não foi definido.Uma variável não definida normalmente se expande para uma string vazia, portanto:

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

é equivalente a este:

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

que é um erro de sintaxe.([ é outro nome para o comando test; geralmente é um link simbólico.)

Tente citar o nome da variável:

if [ "$JAVA_HOME" == "" ]

E se você definir $JAVA_HOME em resposta ao prompt, provavelmente deseja export-lo.(Na verdade, não tenho certeza disso; java depende de $JAVA_HOME sendo definido?)

EDITAR :

Ok, parece que $JAVA_HOME foi definido.

Para o comando test (ou [), o operador de igualdade da string é =, não ==.

Experimente:

if [ "$JAVA_HOME" = "" ]

EDIT2 :

Este:

if [ -z "$JAVA_HOME" ]

é provavelmente melhor (veja a resposta de @ n.m).

Outras dicas

A maneira portátil de verificar strings vazias é

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

ou

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

Também é possível usar if [ "x$VAR" == "x" ].Este formulário é útil para comparar strings arbitrárias que podem estar vazias, por exemplo,if [ "x$JAVA_HOME" == "x$SCALA_HOME" ].

A forma if [ "$VAR" ] pode falhar com algumas encarnações mais antigas do shell, embora o SunOS moderno deva ser OK.

== não é um operador em sh. Um único= é o operador de teste compatível com posix.

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

Acabei de ter este problema no Solaris 10 e encontrei um grande recorte de informação nesta postagem de dez anos: http://lists.infowares.com/archive/clug/2003-February /001849.html

Acabei de tentar 'if ["a"=="a"]; então echo sim; fi 'no bourne prompt de shell em várias plataformas diferentes. Solaris disse 'teste: operador desconhecido== 'AIX disse' sh:==: operador de teste desconhecido 'HP-UX disse 'sh:==: Um parâmetro de comando de teste não é válido.' IRIX disse 'sim' (apenas para ser diferente :))

Em segundo lugar, é possível que sh não saiba o que fazer com sua string vazia. Um hack da velha escola é mudar seu teste para

[ XX"$JAVA_HOME" = XX"" ]

que para mim compara [XX / opt / jdk1.7.0_02= XX] que é falso, em vez de fazer um teste com o lado direito vazio que falha em alguns shells.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top