Você pode verificar facilmente seus scripts de shell usando o ShellCheck online (também disponível como uma ferramenta independente).
Nesse caso, ele indicará que a instrução if precisa de espaços, depois [
e antes ]
, e que você precisa de uma ;
(ou uma nova linha) antes then
da mesma linha.
Quando você tiver corrigido isso, ele continuará dizendo que USER_NAME
é usado sem ser inicializado em nada. Isso ocorre porque você também tem uma user_name
variável (o caso importa). O mesmo vale para PASS
e pass
.
Ele também diz para você usar read -r
para parar read
de manipular \
(pode ser importante para senhas, por exemplo), e que você deve citar duas vezes as variáveis ao chamar sqlplus
para impedir que o shell acidentalmente faça globbing e divisão de palavras de nomes de arquivos (novamente isso é importante se a senha, por exemplo, contém caracteres ocultos de arquivos como *
espaços ou espaços).
Recuar o código também o tornará mais legível:
#!/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
Aqui também possibilitei o uso de senhas com caracteres de espaço à esquerda ou à direita, configurando temporariamente IFS
uma string vazia para a leitura da senha read
.
A lógica também foi alterada para resgatar se $ORACLE_SID
/ $sid
é Test
. Isso evita ter a parte operacional principal do script em uma if
ramificação.