Vous pouvez facilement vérifier vos scripts shell à l'aide de 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 d'un retour à la ligne) avant le then
sur la même ligne.
Lorsque vous aurez corrigé cela, il vous dira qu'il USER_NAME
est utilisé sans être initialisé à quoi que ce soit. En effet, vous avez également une user_name
variable (le cas est important). Il en va de même pour PASS
et pass
.
Il vous indique également d'utiliser read -r
pour arrêter la read
manipulation \
(peut être important pour les mots de passe, par exemple), et que vous devez doubler les variables lors de l'appel sqlplus
pour empêcher le shell de faire accidentellement le remplacement de nom de fichier et le fractionnement de mot (encore une fois, cela est important si le mot de passe, par exemple, contient des caractères de remplacement de fichier comme *
, ou des espaces).
Le retrait du code le rendra également plus lisible:
#!/bin/bash
read -r -p 'please enter username: ' user_name
IFS= read -rs -p 'please enter password: ' pass
printf 'ORACLE_SID = %s\n' "$ORACLE_SID"
sid=$ORACLE_SID
if [ "$sid" = 'Test' ]; then
echo 'Cannot copy' >&2
exit 1
fi
sqlplus -s -l "$user_name/$pass@$sid" <<'SQL_END'
copy from scott/tiger@orcl insert EMP using select * from EMP
exit
SQL_END
Ici, j'ai également permis d'utiliser des mots de passe avec des caractères d'espace de début ou de fin en définissant temporairement IFS
une chaîne vide pour la lecture du mot de passe read
.
La logique a également été modifiée pour renflouer si $ORACLE_SID
/ $sid
est Test
. Cela évite d'avoir la partie opérationnelle principale du script dans une if
branche.