Ответ 1
Цитаты имеют значение.
echo "$var" | wc -l
У меня есть переменная, в которой хранится строка, и мне нужно проверить, есть ли в ней строки:
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
не работает так же хорошо.
Цитаты имеют значение.
echo "$var" | wc -l
Принятые ответы и другие ответы, размещенные здесь, не работают в случае пустой переменной (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
Еще один способ использования здесь строк в Bash:
wc -l <<< "$var"
Как упоминалось в этом комментарии, пустая переменная $var
приведет к 1 строке вместо 0 строк, потому что здесь строки добавляют символ новой строки в этом случае (объяснение).
Вы можете заменить "wc -l" на "wc -w", чтобы скорее подсчитать количество слов вместо строк. Это не будет считать новые строки и может быть использовано для проверки, если исходные результаты пустые, прежде чем продолжить.
Высшие голосовые ответы терпят неудачу, если 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";
Более простая версия ответа @Julian, которая работает для всех строк, с или без завершающего \n (он считает файл, содержащий только один завершающий \n, пустым):
printf "%s" "$a" | grep -c "^"
Выход:
# 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
Никто не упомянул расширение параметров, поэтому здесь есть несколько способов использования чистого bash.
Способ 1
Удалите символы не новой строки, затем получите длину строки + 1. Кавычки важны.
var="${var//[!$'\n']/}"
echo $((${#var} + 1))
Способ 2
Конвертировать в массив, затем получить длину массива. Чтобы это работало, не используйте кавычки.
IFS=$'\n' # let make sure we split on newline chars
var=(${var})
echo ${#var[@]}