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 then
derselben Zeile ein (oder ein neues) Zeichen benötigen .
Wenn Sie dies behoben haben, wird Ihnen mitgeteilt, dass USER_NAME
die Datei verwendet wird, ohne dass eine Initialisierung erforderlich ist. Dies liegt daran, dass Sie auch eine user_name
Variable haben (case matters). Gleiches gilt für PASS
und pass
.
Es sagt Ihnen auch, dass Sie verwenden sollen read -r
, um das read
Zerfleischen zu unterbinden \
(was zum Beispiel für Kennwörter wichtig sein könnte) und dass Sie die Variablen beim Aufrufen sqlplus
in 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 IFS
eine leere Zeichenfolge für das Lesen des Passworts festgelegt wurde read
.
Die Logik wurde auch geändert, um zu retten, wenn $ORACLE_SID
/ $sid
ist Test
. Dadurch wird vermieden, dass sich der Hauptbetriebsteil des Skripts in einer if
Verzweigung befindet.