Проверить пустую строку и файл в оболочке скрипта - PullRequest
0 голосов
/ 08 мая 2020

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

result.log

Collecting: LINK1 HTTP 200
EXCEPT ERROR - REST API LINK2 returned HTTP Error

Скрипт:

  1 cat /healthcheck/bin/gaps/result.log | grep HTTP | while read line
  2 do
  3     echo "$line" | grep "ERROR" >/dev/null
  4     if [ $? = 0 ]; then
  5         RESULT = "TRUE"
  6     fi
  7 done
  8
  9 echo $RESULT

Вывод:

./check.sh: line 5: RESULT: command not found
./check.sh: line 5: RESULT: command not found

Проверка корпуса:

$ shellcheck myscript

Line 1:
cat /healthcheck/bin/gaps/result.log | grep HTTP | while read line
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.
    ^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
                                                         ^-- SC2162: read without -r will mangle backslashes.

Line 4:
     if [ $? = 0 ]; then
          ^-- SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.

Line 5:
         RESULT = "TRUE"
         ^-- SC2030: Modification of RESULT is local (to subshell caused by pipeline).
                ^-- SC1068: Don't put spaces around the = in assignments (or quote to make it literal).

Line 9:
echo $RESULT
     ^-- SC2031: RESULT was modified in a subshell. That change might be lost.

$ 

1 Ответ

1 голос
/ 08 мая 2020

Трубы в подоболочке. Изменения подоболочки не видны родительской оболочке. На сайте bashfaq / 024 представлены возможные обходные пути.

Вы можете поставить разрыв строки, если | - последний символ в строке, нет необходимости создавать сверхдлинные строки для конвейеров.

Переменные в верхнем регистре по соглашению зарезервированы для экспортируемых переменных.

cat ... | grep - бесполезное использование cat. Just grep ... или < file grep.

Когда вы проверяете возвращаемое значение команды, просто if the command; then вместо the command; if [ $? ....

Используйте статус выхода grep s в if. В bash просто if <<<"$string" grep -q "pattern"; then. В оболочке posix do if printf "%s\n" "$string" | grep -q "pattern"; then.

Bash учитывает пространство. RESULT = "TRUE" выполняет команду с именем RESULT с двумя аргументами. Это RESULT="TRUE"

Используйте while IFS= read -r line, чтобы прочитать всю строку точно.

Итак, пока вы могли:

cat /healthcheck/bin/gaps/result.log |
grep HTTP |
{
  while read line
  do
      echo "$line" | grep "ERROR" >/dev/null
      if [ $? -eq 0 ]; then
         RESULT="TRUE"
      fi
  done
  echo $RESULT
}

В вашем случае это просто:

if grep "HTTP" /healthcheck/bin/gaps/result.log | grep -q "ERROR"; then
   echo TRUE
fi
...