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.