Нет, такого нет. Лучшее, что вы можете сделать, - это убедиться, что ваше ядро и все пакеты обновлены для вашего дистрибутива ( sudo apt update && sudo apt upgrade
). Затем поищите конкретную поддержку по возникшим у вас вопросам, указав название и версию вашего дистрибутива, ваше оборудование и проблему, с которой вы столкнулись.
Вы сказали bash установить переменную check = grep
в среде, которую он передает команде
-ci 'text' file.sh
, но ci
] не существует.
Я полагаю, вы хотели заключить эту команду в обратные галочки или в круглые скобки, перед которыми стоит знак доллара, любой из которых будет указывать количество строк, на которых был найден текст (без учета регистра) в файле:
check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)
Теперь $ check
должно быть 0, если совпадений нет, или положительным, если совпадения были.
Не знаете, зачем использовать -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
Ваш вопрос неясен, но судя по отправленному вами коду, похоже, что вы хотите, чтобы переменная check
сохраняла статус завершения команды grep
. Для этого нужно запустить
grep -ci 'text' file.sh
check=$?
. При запуске команды из оболочки ее статус выхода доступен через специальный параметр оболочки $?
.
Это задокументировано POSIX (стандарт для Unix-подобных операционных систем) в его спецификации оболочки , а реализация Bash задокументирована в разделе Специальные параметры .
Поскольку вы новичок, я настоятельно рекомендую вам начать с хорошей книги и / или онлайн-руководства, чтобы получить основы. На сайтах Stack Exchange не рекомендуется рекомендовать внешние ресурсы, но я бы предложил Lhunath and GreyCat’s Bash Guide .
Ваша команда,
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
.