Shell Script – erreur de syntaxe près d'un jeton inattendu `else '

Avec le script shell suivant, pourquoi je reçois des erreurs

syntax error near unexpected token `else' 

Shell Script

 echo "please enter username" read user_name echo "please enter password" read -s pass echo ${ORACLE_SID} SID=${ORACLE_SID} if ["${ORACLE_SID}" != 'Test'] then sqlplus -s -l $USER_NAME/$PASS@$SID <<EOF copy from scott/tiger@orcl insert EMP using select * from EMP exit EOF else echo "Cannot copy" fi 

Vous devez mettre fin à la condition de if comme ceci:

 if [ "${ORACLE_SID}" != 'Test' ]; then 

ou comme ceci:

 if [ "${ORACLE_SID}" != 'Test' ] then 

Note: vous devez également mettre des espaces après [ et avant ] .

La raison de la ; ou linebreak est que la partie condition de l'instruction if est juste une command. Toute command de n'importe quelle longueur pour être précis. Le shell exécute cette command, examine le statut de sortie de la command, puis décide d'exécuter la partie then ou else .

Parce que la command peut être de n'importe quelle longueur, il doit y avoir un marqueur pour marquer la fin de la partie condition. C'est le ; ou la nouvelle ligne, suivie par then .

La raison des espaces après [ est parce que [ est une command. Habituellement un construit de la coquille. Le shell exécute la command [ avec le rest comme parameters, y compris le ] comme dernier paramètre obligatoire. Si vous ne placez pas d'espace après [ le shell essayera d'exécuter [whatever comme command et échouera.

La raison de l'espace avant le ] est similaire. Parce que sinon, il ne sera pas reconnu comme un paramètre propre.

Vous pouvez facilement vérifier vos scripts shell en utilisant ShellCheck en ligne (également disponible en tant qu'outil autonome).

Dans ce cas, il indiquera que l'instruction if a besoin d'espaces, après [ et avant ] , et que vous avez besoin d'un ; (ou une nouvelle ligne) avant le then sur la même ligne.

Une fois que vous avez corrigé cela, il vous indiquera que USER_NAME est utilisé sans initialisation. C'est parce que vous avez également une variable user_name (l'affaire count). La même chose est vraie pour PASS et pass .

Il vous indique également d'utiliser read -r pour arrêter la read de malgling \ (pourrait être important pour les passwords, par exemple) et que vous devriez doubler les variables lors de l'appel de sqlplus (encore une fois ceci est important si le mot de passe, par exemple, contient des caractères de remplissage de file comme * , ou des espaces).

Lorsque vous écrivez, vous voudriez

 if [ "$ORACLE_SID" != "Test" ] then ... fi 

Lorsque vous écrivez bash

 if [[ "$ORACLE_SID" != "Test" ]] then ... fi 

Attention aux espaces s'il vous plaît. Il doit y avoir un espace entre [[ et premier opérateur.