Если ack найдет результаты, сделайте это; иначе сделай это

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

if [ ack --ignore-case 'foo' ]; then
    Do this action
else
    Do that action
fi

На данный момент он всегда выполняет действие else, даже если параметр ack имеет значение true.

Спасибо!


person I Dabble    schedule 24.10.2014    source источник
comment
[ - это команда, а не bash синтаксис.   -  person chepner    schedule 24.10.2014


Ответы (2)


Удалите [ - вы хотите проверить статус выхода ack:

if ack --ignore-case 'foo'; then

ack возвращает статус выхода 0 (успех), если обнаружено совпадение.

Хотя это может выглядеть как синтаксическая конструкция, [ на самом деле является функцией (синонимом test), которая возвращает 0, если тест пройден. if просматривает код возврата этой функции. В этом случае ack дает вам код возврата, который вам нужен, поэтому вам также не следует использовать [.

person Tom Fenech    schedule 24.10.2014
comment
Ооо! Это всегда мелочи. Я проверю это через 6 минут, когда сайт позволит мне - person I Dabble; 24.10.2014
comment
@eBooks_Nashville, если вы это делаете, сделайте это короткими командами, вас также может заинтересовать альтернативный синтаксис ack ... && do_this || do_that - person gboffi; 24.10.2014

Просто снимите квадратные скобки

if ack --ignore-case 'foo' ; then
    Do this action
else
    Do that action
fi

Вы не хотите проверять, что строка ack --ignore-case 'foo' не пуста, вы хотите проверить статус выхода подтверждения.

Вы должны были получить предупреждение об этом:

-bash: [: --ignore-spaces: binary operator expected
person choroba    schedule 24.10.2014