È 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 thensulla stessa riga.
Una volta risolto ciò, continuerà a dirti che USER_NAMEviene utilizzato senza essere inizializzato su nulla. Questo perché hai anche una user_namevariabile (caso importante). Lo stesso vale per PASSe pass.
Ti dice anche di usare read -rper smettere readdi manipolare \(potrebbe essere importante per le password, per esempio), e che dovresti citare due volte le variabili quando chiami sqlplusper 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 IFSuna 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 iframo.