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 thenen la misma línea.
Cuando haya solucionado eso, continuará diciéndole que USER_NAMEse utiliza sin inicializarse a nada. Esto se debe a que también tiene una user_namevariable (los casos son importantes). Lo mismo es cierto para PASSy pass.
También le indica que use read -rpara evitar la readmanipulación \(podría ser importante para las contraseñas, por ejemplo), y que debe citar las variables al llamar sqlpluspara 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 IFSuna cadena vacía para la lectura de la contraseña read.
La lógica también se cambió para rescatar si $ORACLE_SID/ $sides Test. Esto evita tener la parte operativa principal del script en una iframa.