Почему команда wc -l показывает на одну строку меньше, чем ожидается?

Почему код на bash, который подсчитывает количество строк в многострочной переменной `result_content`, возвращает 2 вместо ожидаемых 3 строк? Вот сам код: 

<pre><code class="bash">result_content="# Just some title
# One more title
# comment again just for test"
printf "$result_content" | wc -l</code></pre>

Также, для информации: я использую macOS Monterey 12.7 на Intel.
  • 4 декабря 2024 г. 15:03
Ответы на вопрос 2
Проблема, с которой вы столкнулись, связана с тем, как Unix-подобные системы обрабатывают символы новой строки. В вашем случае переменная `result_content` содержит несколько строк текста, но в конце этой переменной нет символа новой строки.

Когда вы используете команду `printf` для вывода `result_content`, она выводит текст без добавления символа новой строки в конце. Следовательно, `wc -l` считывает только строки, которые были завершены символом новой строки. 

В вашем примере `result_content` содержит 3 строки:

```
# Just some title
# One more title
# comment again just for test
```

Но последняя строка не заканчивается новой строкой, и поэтому `wc -l` подсчитывает только 2 полные строки.

Чтобы получить правильный результат, вы можете добавить символ новой строки в конец переменной `result_content`. Вы можете сделать это несколькими способами:

1. **Добавить символ новой строки вручную**:

```bash
result_content="# Just some title
# One more title
# comment again just for test
"
printf "$result_content" | wc -l
```

2. **Использовать `printf` с аргументом `-e`, который позволяет интерпретировать escape-последовательности**:

```bash
result_content="# Just some title
# One more title
# comment again just for test"
printf "%s\n" "$result_content" | wc -l
```

3. **Использовать `echo` с добавлением символа новой строки**:

```bash
result_content="# Just some title
# One more title
# comment again just for test"
echo -e "$result_content\n" | wc -l
```

Любой из этих методов позволит `wc -l` правильно снять количество строк, и вы получите ожидаемый результат — 3 строки.
Потому что считается количество переводов строки, а у вас последняя строка заканчивается концом файла, а не переводом.
Похожие вопросы