Я почав вивчати Баша пару днів тому.
Я намагаюся отримати вихідний grep
вираз вираження в такій змінній:
check=grep -ci 'text' file.sh
і результат, який я отримав, - це
No command '-ic' found
Чи потрібно це робити з командою pipe?
Я почав вивчати Баша пару днів тому.
Я намагаюся отримати вихідний grep
вираз вираження в такій змінній:
check=grep -ci 'text' file.sh
і результат, який я отримав, - це
No command '-ic' found
Чи потрібно це робити з командою pipe?
Відповіді:
Ваша команда,
check=grep -ci 'text' file.sh
буде інтерпретуватися оболонкою як "запустити команду -ci
з аргументами text
та 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
.
Ваше запитання незрозуміле, але виходячи з поданого вами коду, схоже, що ви хочете, щоб змінна check
зберігала статус виходу grep
команди. Спосіб зробити це - бігти
grep -ci 'text' file.sh
check=$?
При виконанні команди з оболонки, її статус виходу стає доступним через спеціальний параметр оболонки $?
.
Це документується POSIX (стандарт для операційних систем, схожих на Unix) у його специфікації для оболонки, а реалізація Bash задокументована у Спеціальних параметрах .
Оскільки ви новий навчається, я настійно рекомендую почати з хорошої книги та / або онлайн-підручника, щоб отримати основи. Рекомендації щодо зовнішніх ресурсів не рекомендуються на сайтах Stack Exchange, але я б запропонував Lhunath та GreyCat's Bash Guide .
Ви сказали 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. Я використовую його, оскільки ви не зацікавлені в греп-випуску, тільки працював він чи ні.
-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
Правильний спосіб присвоїти вихід команді grep змінній такий, як @ monty-harder згадується:
check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)
Хоча для призначення статусу виходу цієї команди змінній, ви повинні використовувати параметр оболонки $?
відразу після виконання команди, як показано нижче:
grep -ci 'text' file.sh
check=$?
echo $check
$?
відразу після завершення команди.