Как извлечь статус завершения команды в переменную?

Нет, такого нет. Лучшее, что вы можете сделать, - это убедиться, что ваше ядро ​​и все пакеты обновлены для вашего дистрибутива ( sudo apt update && sudo apt upgrade ). Затем поищите конкретную поддержку по возникшим у вас вопросам, указав название и версию вашего дистрибутива, ваше оборудование и проблему, с которой вы столкнулись.

14
16.02.2018, 20:00
4 ответа

Вы сказали bash установить переменную check = grep в среде, которую он передает команде

-ci 'text' file.sh

, но ci ] не существует.

Я полагаю, вы хотели заключить эту команду в обратные галочки или в круглые скобки, перед которыми стоит знак доллара, любой из которых будет указывать количество строк, на которых был найден текст (без учета регистра) в файле:

check=`grep -ci 'text' file.sh`

check=$(grep -ci 'text' file.sh)

Теперь $ check должно быть 0, если совпадений нет, или положительным, если совпадения были.

9
27.01.2020, 19:50

Не знаете, зачем использовать -c при проверке вывода? Он используется для проверки того, сколько раз что-то совпадает - не удачно это или нет.

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

, но в этом примере

check="$(grep --silent -i 'text' file.sh; echo $?)"

он не выводит ничего, кроме кода выхода, который затем отображается эхом. Это результат проверки переменных. Я также предпочитаю это, потому что это одна строка.

Вы можете заменить --silent на -q. Я использую его, потому что вас не интересует вывод grep, независимо от того, работает он или нет.

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1
1
27.01.2020, 19:50

Ваш вопрос неясен, но судя по отправленному вами коду, похоже, что вы хотите, чтобы переменная check сохраняла статус завершения команды grep . Для этого нужно запустить

grep -ci 'text' file.sh
check=$?

. При запуске команды из оболочки ее статус выхода доступен через специальный параметр оболочки $? .

Это задокументировано POSIX (стандарт для Unix-подобных операционных систем) в его спецификации оболочки , а реализация Bash задокументирована в разделе Специальные параметры .

Поскольку вы новичок, я настоятельно рекомендую вам начать с хорошей книги и / или онлайн-руководства, чтобы получить основы. На сайтах Stack Exchange не рекомендуется рекомендовать внешние ресурсы, но я бы предложил Lhunath and GreyCat’s Bash Guide .

4
27.01.2020, 19:50

Ваша команда,

check=grep -ci 'text' file.sh

будет интерпретирована оболочкой как «выполнить команду -ci с аргументами текст и file.sh и установите для переменной check значение grep в ее среде ».


Оболочка сохраняет значение выхода последней выполненной команды в переменной ? .Вы можете присвоить его значение одной из ваших собственных переменных следующим образом:

grep -i 'PATTERN' file
check=$?

Если вы хотите воздействовать на это значение, вы можете либо использовать свою переменную check :

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

, либо пропустить, используя отдельную переменная и необходимость проверять все вместе $? :

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

(обратите внимание на -q , он инструктирует grep ничего не выводить и выйти, как только что-то совпадает; нас действительно не интересует, что здесь совпадает)

Или, если вы просто хотите "что-то делать", когда шаблон не найден:

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

Сохранение $? в другую переменную требуется только в том случае, если вам понадобится использовать его позже, когда значение в $? было перезаписано, как в

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

В приведенном выше фрагменте кода, $? будет перезаписан результатом ["$ err" -ne 0] && [! -d "$ dir"] тест. Сохранять его здесь действительно необходимо только в том случае, если нам нужно отобразить его и использовать с exit .

35
27.01.2020, 19:50

Теги

Похожие вопросы