С помощью следующего сценария оболочки, почему я получаю ошибки
syntax error near unexpected token `else'
Shell Script
echo "please enter username"
read user_name
echo "please enter password"
read -s pass
echo ${ORACLE_SID}
SID=${ORACLE_SID}
if ["${ORACLE_SID}" != 'Test'] then
sqlplus -s -l $USER_NAME/$PASS@$SID <<EOF
copy from scott/tiger@orcl insert EMP using select * from EMP
exit
EOF
else
echo "Cannot copy"
fi
shell
shell-script
oracle-database
Джекоб
источник
источник
Ответы:
Вы должны прекратить условие,
if
как это:или вот так:
Примечание: вы также должны поставить пробелы после
[
и до]
.Причиной
;
переноса строки или является то, что условная частьif
оператора является просто командой. Любая команда любой длины, если быть точным. Оболочка выполняет эту команду, проверяет состояние завершения команды и затем решает, выполнять лиthen
часть илиelse
часть.Поскольку команда может быть любой длины, для обозначения конца условной части необходим маркер. Это
;
или новая строка с последующимthen
.Причина пробелов в
[
том, что[
это команда. Обычно это встроенная оболочка. Оболочка выполняет команду[
с остальными параметрами, включая]
обязательный последний параметр. Если вы не поставите пробел после того,[
как оболочка попытается выполнить[whatever
как команду и завершится ошибкой.Причина для пространства до того
]
похожа. Потому что в противном случае он не будет распознаваться как собственный параметр.источник
test.sh: line 6: [: missing
] '`if
это синтаксис, это не обычная команда. Это зарезервированное слово. В отличие от многих других языков программирования, оболочка не распознает зарезервированные слова везде, только когда они являются первым словом команды (с некоторыми тонкостями).if
это синтаксис. Я пытался сообщить, что условие условиеif
не ограничено определенной формой по синтаксису. Я отредактировал текст. Надеюсь, теперь стало понятнее.Вы можете легко проверить свои сценарии оболочки, используя ShellCheck онлайн (также доступный как самостоятельный инструмент).
В этом случае он укажет, что оператору if нужны пробелы после
[
и до]
, и что вам нужно;
(или символ новой строки) передthen
той же строкой.Когда вы исправите это, он будет рассказывать вам, что
USER_NAME
он используется без какой-либо инициализации. Это потому, что у вас также естьuser_name
переменная (регистр имеет значение). То же самое относится и кPASS
иpass
.Он также говорит, что вы должны использовать,
read -r
чтобы остановитьread
искажения\
(например, это может быть важно для паролей), и что вы должны ставить в кавычки переменные при вызове,sqlplus
чтобы предотвратить случайное выполнение оболочкой слежения за именами файлов и разделения слов (опять же, это важно, если пароль, например, содержит символы, такие как*
или пробелы).Отступ кода также сделает его более читабельным:
Здесь я также сделал возможным использование паролей с начальными или конечными пробелами, временно установив
IFS
пустую строку для чтения пароляread
.Логика также была изменена, чтобы выручить, если
$ORACLE_SID
/$sid
естьTest
. Это позволяет избежать основной рабочей части скрипта вif
ветке.источник
if ([ x = x ]) then (echo yes) fi
также работает.if
операторы с[ ... ]
... :-)При написании
sh
вы хотели быПри написании
bash
Обратите внимание на пробелы, пожалуйста. Между
[[
первым оператором должен быть пробел .источник