Вы можете легко проверить свои сценарии оболочки, используя 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
ветке.