@Drovosek01

Почему неправильно считается количество строк глобами?

Основная ОС - macOS Monterey Intel.
Автоматизирую некоторые задачи на shell/bash (только начинаю углубленно погружаться в эту тему)

Встал вопрос подсчета количества строк.
Я через find получаю количество строк и сразу записываю результат выполнения команды в переменную.
Пример:
myvar=$(find "/tmp/folders" -iname "App *" -type d -maxdepth 1)


Погуглив как подсчитать количество строк, нашел много вариантов, в том числе
https://stackoverflow.com/a/32727260
Собственно так и делаю:
count=${#myvar[@]}
echo $count

И в ответ получаю число 120, которое означает количество символов, а не строк

Если подсчитать количество строк в переменной другим путем, например с помощью grep:
echo $myvar | grep -c ^
Тогда результат получается верный

Вопросы:
1. Реально ли подсчитать количество строк в файле или переменной с помощью глобов, как показано тут - https://stackoverflow.com/a/32727260 ?
2. Почему в моем примере выводится количество символов в переменной, а не количество строк?
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
myvar=$(find "/tmp/folders" -iname "App *" -type d -maxdepth 1)
count=${#myvar[@]}
echo $count


И в ответ получаю число 120, которое означает количество символов, а не строк

И это верно.

2. Почему в моем примере выводится количество символов в переменной, а не количество строк?

Потому что ${#myvar[@]} -- это длина массива. Если идея была создать в первой строке массив из имён файлов, то там не хватает пары скобок:
myvar=( $(find "/tmp/folders" -iname "App *" -type d -maxdepth 1) )

С таким определением myvar становится массивом а ${#myvar[@]} выведет длину этого массива, т.е. количество строк в нём.
spoiler
Имена файлов с пробелами, кстати, эту стройную картину малость испортят.
С вашим определением выводится длинна массива, но в качестве массива выступает одна строка, так что это длина строки в символах.

1. Реально ли подсчитать количество строк в файле или переменной с помощью глобов, как показано тут - https://stackoverflow.com/a/32727260 ?

Да. Но использование для этой цели массивов оболочки выглядит странно и расточительно. В shell канонично считать строки командой wc -l.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы