Bash цикл for, если число условий равно нулю? - PullRequest
1 голос
/ 21 ноября 2011

У меня есть цикл for в bash, который является

for Names in `grep "name" $people`
do
    echo "name is $name"
done

Как мне получить оператор if, который говорит что-то вроде:

for Name in `grep "name" $people`
# Make sure we found some names
if [ "count of $Name=0" ]
then
    echo "no names found"
fi

# Else, if we did grep out a list of names, print them
do
    echo "name is $Name"
done

Ответы [ 4 ]

4 голосов
/ 21 ноября 2011

Добавьте составной условный тест (&&) для печати текста отладки, если блок for имеет код возврата 0 (это означает, что он никогда не попадал в цикл и вызывался false):

for NAME in $(grep "name" $people)
do
    echo "Name is ${NAME}"
    false
done && echo "no names found"

Если вам не нравится, как он читает, просто инвертируйте для:

! for NAME in $(grep "name" $people)
do
    echo "Name is ${NAME}"
    false
done || echo "no names found"
1 голос
/ 22 ноября 2011

Это может работать для вас:

sed -n '/name/{h;s//name is &/p};${x;/./!s/^/no names found/p}' $people

Предполагается, что $people - это файл, содержащий не менее одной строки

РЕДАКТИРОВАТЬ: Объяснение - -n запретить печать по умолчанию на стандартный вывод.Найдите name в каждой строке файла $people и, если найдена, скопируйте строку для хранения пробела (HS) и добавьте name is к значению и распечатайте.В последней строке переключитесь на HS и, если он ничего не содержит, распечатайте no names found.

Альтернатива bash:

names=($(grep "name" $people))
((${#names[@]})) && printf "name is %s\n" "${names[@]}" || printf "no names found\n"

EDIT: заполните массив names с помощью grep выход.Проверьте размер массива names и, если он не равен нулю, добавьте name is к каждому значению и распечатайте, иначе распечатайте no names found.

1 голос
/ 21 ноября 2011

Вы не можете сделать это внутри цикла. Установите значение true в цикле или проверьте количество аргументов.

set -- `grep "$name" people`
case $# in 0) echo no names found >&2;;
  *) for Name; do # special form - loop over $*
      echo name is "$Name"
  done ;;
esac
1 голос
/ 21 ноября 2011

Сначала выполните grep и сохраните его результат в переменной. Затем проверьте, возвращено ли что-нибудь, например, с помощью wc. Если это так, запустите цикл с результатом grep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...