Puede verificar fácilmente sus scripts de shell utilizando ShellCheck en línea (también disponible como una herramienta independiente).
En este caso, señalará que la instrucción if necesita espacios, después [
y antes ]
, y que necesita un ;
(o una nueva línea) antes del then
en la misma línea.
Cuando haya solucionado eso, continuará diciéndole que USER_NAME
se utiliza sin inicializarse a nada. Esto se debe a que también tiene una user_name
variable (los casos son importantes). Lo mismo es cierto para PASS
y pass
.
También le indica que use read -r
para evitar la read
manipulación \
(podría ser importante para las contraseñas, por ejemplo), y que debe citar las variables al llamar sqlplus
para evitar que el intérprete accidentalmente se bloquee el nombre del archivo y se divida la palabra (de nuevo, esto es importante si la contraseña, por ejemplo, contiene caracteres globales de archivos como *
espacios).
La sangría del código también lo hará más legible:
#!/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
Aquí también he hecho posible el uso de contraseñas con caracteres de espacio iniciales o finales al configurar temporalmente IFS
una cadena vacía para la lectura de la contraseña read
.
La lógica también se cambió para rescatar si $ORACLE_SID
/ $sid
es Test
. Esto evita tener la parte operativa principal del script en una if
rama.