Подтвердить что ты не робот

Проверьте вывод команды в оболочке script

Я пишу очень простые сценарии оболочки, которые будут смотреть на журнал всех неудавшихся тестов и распечатывать все имена всех файлов в текущем каталоге, которые находятся в журнале

 1  #! /bin/sh

 2  for file in *
 3  do
 4      echo "checking: $file"
 5      if [$(grep $file failed.txt -c) -ne 0]
 6      then
 7          echo "$file FAILED"
 8      fi
 9  done

Когда я его выполнил, я получаю эту ошибку:

line 6: [0: command not found

Кто-нибудь знает, почему?

Спасибо!!

4b9b3361

Ответ 1

[ - фактически команда в linux (например, bash или cat или grep).

$(grep $file failed.txt -c) - это подстановка команд, которая в вашем случае оценивается до 0. Таким образом, строка теперь читает [0 -ne 0], которая интерпретируется как запускающая программу с именем [0 с аргументами -ne 0].

Вместо этого вы должны написать [ $(grep $file failed.txt -c) -ne 0 ]. Сценарии оболочки требуют, чтобы между открывающимися и закрывающимися квадратными скобками были пробелы. В противном случае вы измените исполняемую команду (закрытие ] означает, что больше нет аргументов для чтения.

Итак, теперь команда оценивается как [ 0 -ne 0 ]. Вы можете попробовать выполнить это в своей оболочке, чтобы узнать, что произойдет. [ выходит со значением 0, если выражение истинно и 1, если оно ложно. Вы можете увидеть значение выхода, эхосигнал $? (значение выхода последней команды для запуска).

Ответ 2

Вместо проверки счетчика вы можете проверить код возврата grep:

if grep -q $file failed.txt &>/dev/null

Ответ 3

script может быть

#!/bin/sh

for file in *; do
    echo "checking: $file"
    grep failed.txt $file && echo "$file FAILED"
done

или, как однострочный в истории команд командной оболочки пользователя:

for file in *; do { echo "checking: $file" && grep failed.txt $file && echo "$file FAILED"; done

in man grep

СОСТОЯНИЕ ВЫХОДА
       Статус выхода равен 0, если выбраны линии, и 1, если они не найдены. Если произошла ошибка, статус выхода равен 2. (Примечание: код обработки ошибок POSIX должен проверять значение "2" или больше.)