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 thensur la même ligne.
Lorsque vous aurez corrigé cela, il vous dira qu'il USER_NAMEest utilisé sans être initialisé à quoi que ce soit. En effet, vous avez également une user_namevariable (le cas est important). Il en va de même pour PASSet pass.
Il vous indique également d'utiliser read -rpour arrêter la readmanipulation \(peut être important pour les mots de passe, par exemple), et que vous devez doubler les variables lors de l'appel sqlpluspour 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 IFSune chaîne vide pour la lecture du mot de passe read.
La logique a également été modifiée pour renflouer si $ORACLE_SID/ $sidest Test. Cela évite d'avoir la partie opérationnelle principale du script dans une ifbranche.