Команда оболочки - условие, основанное на выводе команды? - PullRequest
2 голосов
/ 29 июня 2010

Я пытаюсь запустить какую-нибудь команду оболочки, если в текстовом файле отсутствует строка. Если я вставлю эту строку в командную строку, если выдаст ошибку.

if [ $(cat textfile.txt | grep "search string") -eq "" ]; then; echo "some string"; fi;

Ошибка:

-bash: [: -eq: unary operator expected

Ответы [ 4 ]

6 голосов
/ 29 июня 2010

Если вы используете [] для сравнения, вам нужно использовать = вместо -eq. Вам также нужны цитаты.

if [ "$(cat textfile.txt | grep 'search string')" = "" ]; then; echo "some string"; fi;

Обратите внимание, что grep может принимать имя файла в качестве аргумента, поэтому cat не требуется. Вы также можете напрямую использовать возвращаемое значение grep: grep возвращает 1, если строка поиска не найдена.

if [ "$(grep 'search string' textfile.txt)" ]; then
  echo "some string";
fi

Еще более компактный способ - использовать логические и &&.

grep "search string" textfile.txt && echo "some string"
2 голосов
/ 29 июня 2010
grep -F -q -e 'search string' textfile.txt || echo 'Not found'

Примечание:

  • -F предотвращает интерпретацию строки поиска как регулярного выражения.
  • -q подавляет все выходные данные и возвращает их сразу после того, как был найден первый экземпляр, что значительно ускоряет поиск, если строка появляется в начале большого файла.
  • -e явно указывает шаблон, позволяя шаблонам начинаться с тире.
  • Используйте одинарные кавычки, если не хотите подстановки переменных.
1 голос
/ 29 июня 2010

В этом случае квадратные скобки не нужны. Поскольку [ на самом деле является командой, любая команда может использоваться там, где вы ее используете. Итак, здесь мы можем использовать grep. Нет необходимости использовать cat, поскольку grep будет принимать имена файлов в качестве аргументов. Кроме того, у вас есть две слишком много точек с запятой.

if grep -q "search string" textfile.txt; then echo "some string"; fi

или

if grep "search string" textfile.txt > /dev/null 2>&1; then echo "some string"; fi
1 голос
/ 29 июня 2010

Команда grep вернет 0, если запрошенные строки найдены (1, если нет, 2, если ошибка), поэтому вы можете просто использовать:

grep "search string" textfile.txt >/dev/null 2>&1
if [[ $? -ne 0 ]] ; then
    echo 'Not found'
fi

Если вы действительно хотели использовать строки (а вы, вероятно, не должны), вы должны заключить их в кавычки, чтобы вы не получили слишком много аргументов для команды [:

if [ "$(cat textfile.txt | grep 'search string')" == "" ] ; then
    echo "It's not there!"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...