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