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 thenda 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_namevariável (o caso importa). O mesmo vale para PASSe pass.
Ele também diz para você usar read -rpara parar readde manipular \(pode ser importante para senhas, por exemplo), e que você deve citar duas vezes as variáveis ao chamar sqlpluspara 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 IFSuma 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 iframificação.