Ви можете легко перевірити свої сценарії оболонки, використовуючи ShellCheck в Інтернеті (також доступний як окремий інструмент).
У цьому випадку буде вказано, що оператору if потрібні пробіли після [і перед ], і що вам потрібен ;(або новий рядок) перед thenтим же рядком.
Коли ви виправите це, він продовжить повідомляти вам, що USER_NAMEвикористовується без ініціалізації ні до чого. Це тому, що у вас також є user_nameзмінна (справа має значення). Те саме стосується PASSі pass.
Він також говорить вам, щоб використовувати read -rдля зупинки readвід mangling \(це може бути важливо для паролів, наприклад), і що ви повинні подвоїти цитування змінних під час виклику, 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гілці.