Вы можете легко проверить свои сценарии оболочки, используя ShellCheck онлайн (также доступный как самостоятельный инструмент).
В этом случае он укажет, что оператору if нужны пробелы после [и до ], и что вам нужно ;(или символ новой строки) перед thenтой же строкой.
Когда вы исправите это, он будет рассказывать вам, что USER_NAMEон используется без какой-либо инициализации. Это потому, что у вас также есть user_nameпеременная (регистр имеет значение). То же самое относится и к PASSи pass.
Он также говорит, что вы должны использовать, read -rчтобы остановить readискажения \(например, это может быть важно для паролей), и что вы должны ставить в кавычки переменные при вызове, sqlplusчтобы предотвратить случайное выполнение оболочкой слежения за именами файлов и разделения слов (опять же, это важно, если пароль, например, содержит символы, такие как *или пробелы).
Отступ кода также сделает его более читабельным:
#!/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
Здесь я также сделал возможным использование паролей с начальными или конечными пробелами, временно установив IFSпустую строку для чтения пароля read.
Логика также была изменена, чтобы выручить, если $ORACLE_SID/ $sidесть Test. Это позволяет избежать основной рабочей части скрипта в ifветке.