Sie können Ihre Shell-Skripte problemlos mit ShellCheck online überprüfen (auch als eigenständiges Tool verfügbar).
In diesem Fall wird darauf hingewiesen, dass die if-Anweisung nach [und vor Leerzeichen benötigt ]und dass Sie ;vor thenderselben Zeile ein (oder ein neues) Zeichen benötigen .
Wenn Sie dies behoben haben, wird Ihnen mitgeteilt, dass USER_NAMEdie Datei verwendet wird, ohne dass eine Initialisierung erforderlich ist. Dies liegt daran, dass Sie auch eine user_nameVariable haben (case matters). Gleiches gilt für PASSund pass.
Es sagt Ihnen auch, dass Sie verwenden sollen read -r, um das readZerfleischen zu unterbinden \(was zum Beispiel für Kennwörter wichtig sein könnte) und dass Sie die Variablen beim Aufrufen sqlplusin doppelte Anführungszeichen setzen sollten, um zu verhindern, dass die Shell versehentlich Dateinamen verschiebt und Wörter aufteilt (dies ist wiederum wichtig, wenn Das Passwort enthält zum Beispiel Zeichen wie "Datei" *oder Leerzeichen.
Durch Einrücken des Codes wird er auch lesbarer:
#!/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
Hier habe ich es auch möglich gemacht, Passwörter mit führenden oder nachfolgenden Leerzeichen zu verwenden, indem vorübergehend IFSeine leere Zeichenfolge für das Lesen des Passworts festgelegt wurde read.
Die Logik wurde auch geändert, um zu retten, wenn $ORACLE_SID/ $sidist Test. Dadurch wird vermieden, dass sich der Hauptbetriebsteil des Skripts in einer ifVerzweigung befindet.