Проверьте вывод команды в оболочке 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
Кто-нибудь знает, почему?
Спасибо!!
Ответы
Ответ 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" или больше.)