В bash как посчитать количество строк в переменной? - PullRequest
58 голосов
/ 11 июня 2011

У меня есть переменная, в которой хранится строка, и мне нужно проверить, есть ли в ней строки:

var=`ls "$sdir" | grep "$input"`

псевдокод:

while [ ! $var's number of lines -eq 1 ]
  do something

Это моя идеяо том, как это проверить.echo $var | wc -l не работает - он всегда говорит 1, хотя он имеет 3.

echo -e также не работает.

Ответы [ 7 ]

84 голосов
/ 11 июня 2011

Цитаты имеют значение.

echo "$var" | wc -l
47 голосов
/ 22 февраля 2017

Принятый ответ и другие ответы, опубликованные здесь, не работают в случае пустой переменной (неопределенной или пустой строки).

Это работает:

echo -n "$VARIABLE" | grep -c '^'

Например:

ZERO=
ONE="just one line"
TWO="first
> second"

echo -n "$ZERO" | grep -c '^'
0
echo -n "$ONE" | grep -c '^'
1
echo -n "$TWO" | grep -c '^'
2
20 голосов
/ 12 июня 2013

Другой способ использования здесь строк в bash:

wc -l <<< "$var"

Как упоминалось в в этом комментарии , пустое $var приведет к 1 строке вместо0 строк, потому что здесь строки в этом случае добавляют символ новой строки ( пояснение ).

8 голосов
/ 12 июня 2013

Вы можете заменить "wc -l" на "wc -w", чтобы посчитать количество слов вместо строк. Это не будет считать новые строки и может быть использовано для проверки, если ваши исходные результаты пусты, прежде чем продолжить.

3 голосов
/ 18 февраля 2019

Более простая версия ответа @ Julian, которая работает для всех строк, с или без завершающего \ n (он считает файл, содержащий только один завершающий \ n, пустым):

printf "%s" "$a" | grep -c "^"

  • Возвращает ноль: неустановленная переменная, пустая строка, строка, содержащая пустую новую строку
  • Возвращает 1: любая непустая строка, с или без завершающей новой строки
  • и т. Д.

Вывод:

# a=
# printf "%s" "$a" | grep -c "^"
0

# a=""
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf "")"
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf "\n")"
# printf "%s" "$a" | grep -c "^"
0

# a="$(printf " \n")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf " ")"
# printf "%s" "$a" | grep -c "^"
1

# a="aaa"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s" "aaa")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s\n" "aaa")"
# printf "%s" "$a" | grep -c "^"
1

# a="$(printf "%s\n%s" "aaa" "bbb")"
# printf "%s" "$a" | grep -c "^"
2

# a="$(printf "%s\n%s\n" "aaa" "bbb")"
# printf "%s" "$a" | grep -c "^"
2
3 голосов
/ 28 апреля 2017

Ответы с наибольшим количеством голосов потерпели неудачу, если grep не дал результатов.

Homer Simpson
Marge Simpson
Bart Simpson
Lisa Simpson
Ned Flanders
Rod Flanders
Todd Flanders
Moe Szyslak

Это неправильный 1006 * способ сделать это :

wiggums=$(grep -iF "Wiggum" characters.txt);
num_wiggums=$(echo "$wiggums" | wc -l);
echo "There are ${num_wiggums} here!";

Там нам скажут, что в списке есть 1 Виггам , даже если их нет.

Вместо этого вам нужно сделать одну дополнительную проверкучтобы увидеть, является ли переменная пустой (-z, как в «ноль»).Если grep ничего не возвращал, переменная будет пустой.

matches=$(grep -iF "VanHouten" characters.txt);

if [ -z "$matches" ]; then
    num_matches=0;
else
    num_matches=$(echo "$matches" | wc -l);
fi

echo "There are ${num_matches} VanHoutens on the list";
2 голосов
/ 23 октября 2018

Никто не упомянул расширение параметров, поэтому здесь есть несколько способов использования чистого bash.

Метод 1

Удалите символы, не являющиеся символом новой строки, затем получите строкудлина + 1. Важны кавычки .

 var="${var//[!$'\n']/}"
 echo $((${#var} + 1))

Метод 2

Преобразовать в массив, затем получить длину массива. Чтобы это работало, не используйте кавычки .

 var=(${var})
 echo ${#var[@]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...