Notez que si vous voulez déterminer si une variable est définie, vous ne voudrez probablement pas utiliser if/else ou test ([). Il est plus courant de faire des choses comme :
# Abort if JAVA_HOME is not set (or empty)
: ${JAVA_HOME:?JAVA_HOME is unset}
 ou
# report the value of JAVA_HOME, or a default value
echo ${JAVA_HOME:-default value}
 ou
# Assign JAVA_HOME if it is unset (or empty)
: ${JAVAHOME:=default value}
 if [ -z $JAVA_HOME  ]  
then  
    echo $JAVA_HOME  
else  
    echo "NO JAVA HOME SET"  
fi
 
 Vous vous heurtez à une limitation stupide de la façon dont sh développe les arguments. La ligne 3 de votre script est étendue à :
if [ != ]
 
 Quel sh ne sait pas quoi faire avec. Essayez ce vilain hack pour la taille :
if [ x$JAVA_HOME != x ]
 
 Les deux arguments doivent être non vides, nous lancerons donc simplement un x dans les deux et voyez ce qui se passe.
Alternativement, il existe un opérateur séparé pour tester si une chaîne n'est pas vide :
if [ !-z $JAVA_HOME ]
 
 (-z teste si la chaîne suivante est vide.)
 Le -n et -z les options sont des tests qui doivent être utilisés ici :
if [ -n "$JAVAHOME" ]; then
    echo "$JAVAHOME";
else
    echo "\$JAVAHOME not set";
fi