Рейтинг:0

bash объединение строк в цикле приводит к пустой строке

флаг mx

У меня есть следующий файл

Привет
Мир
мой
имя
является
FalcoGer

И я хочу объединить строки каждой строки.

Я написал следующий скрипт, чтобы сделать именно это.

#! /USR/бин/Баш
myFile=/home/FalcoGer/testfile.txt

результат=""
кот $мой файл | при чтении строки
делать
  результат+="$строка"
сделано

эхо Результат: $результат

Однако я получаю только Результат: с пустой строкой. Когда я печатаю его из цикла, кажется, что он работает нормально. Что не так с этим скриптом и как его исправить?

флаг uz
Jos
Вы не можете объединять такие строки в bash. Попробуйте `result="$result $line"` .
флаг hr
См. [Почему моя переменная локальна в одном цикле «пока читается», но не в другом, казалось бы, похожем цикле?] (https://unix.stackexchange.com/questions/9954/why-is-my-variable-local-in -один-во время-чтения-цикл-но-не-в-другом-по-видимому)
FalcoGer avatar
флаг mx
@Джос, да, ты можешь. `+=` является допустимым оператором в bash. https://stackoverflow.com/questions/4181703/how-to-concatenate-string-variables-in-bash
waltinator avatar
флаг it
Всегда вставляйте свой скрипт в `https://shellcheck.net`, средство проверки синтаксиса или устанавливайте `shellcheck` локально. Сделайте использование `shellcheck` частью вашего процесса разработки. Кроме того, пробел в первой строке неверен. Используйте "#!/bin/bash`".
флаг uz
Jos
Сегодня я узнал :-)
флаг hr
Кстати, я предполагаю, что вы просто используете это как упражнение, чтобы узнать о циклах - если нет, есть лучшие варианты, такие как `result=$(paste -sd ' '
FalcoGer avatar
флаг mx
На самом деле @steeldriver я использую его для загрузки содержимого мастерской из steamcmd с помощью текстового файла. Я просто разбил его для минимального примера. Я предпочитаю читабельный синтаксис короткому. Мне в любом случае нужно обработать `$line`, поэтому мне нужен цикл.
флаг hr
Если вам нужно обработать строки, обычно это еще большая причина **не** использовать цикл оболочки. См., например, [Почему использование цикла оболочки для обработки текста считается плохой практикой?](https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text - считается плохой практикой)
Рейтинг:4
флаг mx

Использование канала по существу создает новый скрипт с новой областью действия. Вы можете избежать трубы следующим образом:

#! /USR/бин/Баш
myFile=/home/FalcoGer/testfile.txt

результат=""
при чтении строки -r
делать
  результат+="$строка"
сделано < $myFile

эхо Результат: $результат
флаг cn
Это [BashFAQ 24](http://mywiki.wooledge.org/BashFAQ/024)
bac0n avatar
флаг cn
Обычно вы хотите добавить `-r` для чтения.
FalcoGer avatar
флаг mx
@bac0n казалось бы, да.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.