Подтвердить что ты не робот

В bash, как мне подсчитать количество строк в переменной?

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

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

псевдокод:

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

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

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

4b9b3361

Ответ 1

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

echo "$var" | wc -l

Ответ 2

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

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

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

Ответ 3

Еще один способ использования здесь строк в Bash:

wc -l <<< "$var"

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

Ответ 4

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

Ответ 5

Высшие голосовые ответы терпят неудачу, если grep не возвращает никаких результатов.

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

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

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

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

Вместо этого вам нужно сделать еще одну дополнительную проверку, чтобы увидеть, пуста ли переменная (-z, как в "0" ). Если 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";

Ответ 6

Более простая версия ответа @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

Ответ 7

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

Способ 1

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

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

Способ 2

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

 IFS=$'\n' # let make sure we split on newline chars
 var=(${var})
 echo ${#var[@]}