È possibile controllare facilmente gli script della shell utilizzando ShellCheck online (disponibile anche come strumento autonomo).
In questo caso, indicherà che l'istruzione if ha bisogno di spazi, dopo [
e prima ]
, e che è necessario un ;
(o una nuova riga) prima di then
sulla stessa riga.
Una volta risolto ciò, continuerà a dirti che USER_NAME
viene utilizzato senza essere inizializzato su nulla. Questo perché hai anche una user_name
variabile (caso importante). Lo stesso vale per PASS
e pass
.
Ti dice anche di usare read -r
per smettere read
di manipolare \
(potrebbe essere importante per le password, per esempio), e che dovresti citare due volte le variabili quando chiami sqlplus
per impedire alla shell di fare accidentalmente il nome del file e la suddivisione delle parole (anche questo è importante se la password, ad esempio, contiene file come globbing di caratteri *
o spazi).
Il rientro del codice lo renderà anche più leggibile:
#!/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
Qui ho anche reso possibile l'uso di password con caratteri di spazio iniziali o finali impostando temporaneamente IFS
una stringa vuota per la lettura della password read
.
Anche la logica è stata cambiata per salvare se $ORACLE_SID
/ $sid
è Test
. Questo evita di avere la parte operativa principale dello script in un if
ramo.