Обратите внимание, что grep
соответствует каждой строке ввода, а не вводу в целом, поэтому обычно не подходит для произвольных строк. Вы можете использовать awk
вместо этого (остерегайтесь, что это расширенные регулярные выражения , подобные тем, которые понимаются grep -E
или bash
's[[ string =~ regexp ]]
).
regexp_match() {
awk 'BEGIN{if (ARGV[1] !~ ARGV[2]) exit(1)}' "$@"
}
if [ "$a" = y ] || [ "$a" = Y ] && regexp_match "$b" REGEXP; then
...
fi
Обратите внимание, что бинарных операторов -a
/-o
[
следует избегать. Они объявлены устаревшими POSIX и имеют ряд проблем. Например, здесь, на FreeBSD:
$ a='(' /bin/sh -c '[ "$a" = y -o "$a" = Y ]'
[: closing paren expected
Просто пример одного из возможных способов использования awk и внешних команд:
is_logged($1) { print $1, "is present!"}
function is_logged(x,a){ ## a local var
"who|grep -w " x | getline a
return a
}
А потом:
$ awk -f test
abc
Darunia
-->Darunia is present!
#! /bin/sh -
is_logged_in() {
who | USER=$1 awk -v ret=1 '
$1"" == ENVIRON["USER"]"" {ret = 0; exit}
END {exit(ret)}'
}
if is_logged_in root; then
echo root is logged in
fi
Определяетis_logged_in
функцию оболочки , которая принимает имя пользователя в качестве аргумента. Мы передаем вывод who
в awk
, которому мы передали аргумент функции в переменной окружения USER
.
Код awk
обрабатывает каждую запись по очереди. Если первое поле в записи равно значению этой переменной окружения (, здесь добавление ""
к операндам для принудительного сравнения строк ), тогда мы выходим со статусом выхода 0 (успех ).
Затем эту функцию можно использовать в операторах if
для проверки того, вошел ли пользователь в систему.