2015-12-23 1 views
1

Мои опыты с более новыми (приличными) языками. Я привык иметь попытку/улов в моем распоряжении.Как выйти, если у Bash есть ошибка выражения, например [: -ne: ожидаемый операционный оператор

Я обязан своим клиентом использовать Bash.

У меня есть сценарий, который сделает что-то очень рискованное, но первая часть скрипта - это проверка того, что все так, как ожидалось, прежде чем мы начнем рискованную процедуру. Во время этой фазы проверки я хочу, чтобы, если что-то не так, немедленно выйдите.

Поэтому я использую:

set -e -u -o pipefail 
set -o errtrace 

Но сценарий все еще продолжает после генерации ошибки как:

[: -ne: unary operator expected 

Он продолжит выполнение сценария, и начать рискованную процедуру, даже если проверка не удалась !

Как я могу обнаружить ошибку такого типа в Bash во время выполнения?

+0

ли вы попробовать '-n ... Читать команды, но не выполнять их. Это можно использовать для проверки сценария оболочки для синтаксических ошибок. Это игнорируется интерактивными shells.' из раздела 'set'' man bash'. Удачи. – shellter

+0

Синтаксическая ошибка с переменным расширением в некоторых случаях, также, что код не будет достигнут, если предыдущая команда не будет выполнена. –

+0

хорошо, если вы имеете в виду переменное расширение, как в строке 'myVar =" с пробелами "; if [[$ myVar == 'string with spaces']] ', тогда вам нужно прочитать через http://stackoverflow.com/tags/bash/info. Помните, что переменные dbl-quote находятся в верхних пяти вещах, которые вам всегда нужно делать. Хотя 'try/catch', безусловно, хорошо, вы можете обнаружить, что скрипты' shell' решают большую (иш) группу проблем с минимальным избыточным кодированием. Удачи. – shellter

ответ

3

Прежде всего вам нужно знать, что [ ... ] - это команда, а не элемент синтаксиса. Это вариант команды test. [ - это команда, а ... ] - это переданные ей аргументы. ] должен быть последним аргументом.

Проблема заключается в том, что аргументы, передаваемые в [ разбираются [ и не Баш и if элемент синтаксиса не будет выдавать ошибку на ненулевых возвращаемых значениях выполняемого теста, это природа.

Обходным способом было бы использовать [[ (расширенный тест). Bash будет проверять синтаксис аргументов, переданных [[

Далее читайте: http://tldp.org/LDP/abs/html/testconstructs.html

+0

Ключ в том, что ошибки в состоянии оператора 'if' игнорируются' set -e', так как он * ожидается *, что команда может выйти из строя. – chepner

+0

Нет, это не связано с 'if'; это связано с ''. Попробуйте '[['. bash не будет работать, если синтаксис неверен, и используется 'set -e'. Btw, '[' в настоящее время bash встроен как '[[' is. Я имею в виду, что bash * может * проверить синтаксис. Однако он также доступен как простая команда '/ bin/['. Я думаю, bash не проверяет синтаксис, чтобы поддерживать совместимость с '/ bin/['. – hek2mgl

+0

Потому что с '[[', это фактическая синтаксическая ошибка. С '[', нет синтаксической ошибки, только действительная команда с ненулевым статусом выхода. Хотя * конкретный * код выхода (1 для ложного выражения, 2 для недопустимого выражения) может различать два случая: 'set -e' не знает о каком-либо конкретном соглашении команды. Он просто видит, что команда не выполнена как часть условия 'if' и игнорирует ее. – chepner

Смежные вопросы