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

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

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

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

Спасибо!

2 ответа

Решение

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

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

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

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

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

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

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

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

-bash: [: --ignore-spaces: binary operator expected
Другие вопросы по тегам