Проблема
Как я могу сохранить целый вывод строки от grep
как 1 переменная, не для каждой строки.
Пример (мне нужны всего 3 переменные, целые строки).
user@local:~/bin/kb$ grep -E '##.*bash.*file.*add' bash.kb
## bash, file, add string behind founded string
## bash, files, add string to begin
## bash, file, add comma to end of line except last line
user@local:~/bin/kb$
Но for
пример.
user@local:~/bin/kb$ for i in $(grep -E '##.*bash.*file.*add' bash.kb); do echo $i; done
##
bash,
file,
add
string
behind
founded
string
##
bash,
files,
add
string
to
begin
##
bash,
file,
add
comma
to
end
of
line
except
last
line
user@local:~/bin/kb$
Мне нужно это (только 3 переменные как целая строка).
1st variable $i[0] = '## bash, file, add string behind founded string'
2nd variable $i[1] = '## bash, files, add string to begin'
3rd variable $i[2] = '## bash, file, add comma to end of line except last line'
Как я могу сделать это?
Спасибо.
Ваша проблема - это
for i in $(grep -E '##.*bash.*file.*add' bash.kb); do echo $i; done
выполняет итерации по разграниченным пробелом словам в выводе команды. Это иногда упоминается как разделение слова или в более общем плане, как разделено + шарик.
Можно считать строки в индексный массив в использовании удара mapfile
(или его синоним, readarray
). Поскольку mapfile
чтения от стандартного входа, замените замену команды $( ... )
с заменой процесса <( ... )
:
mapfile -t var < <(grep -E '##.*bash.*file.*add' bash.kb)
Можно получить использование значений "${var[0]}"
,"${var[1]}"
и т.д. (массивы основаны на нуле), или цикл по ним всем использование
for i in "${var[@]}"; do echo "$i"; done
Отметьте использование двойных кавычек для предотвращения разделения слова в элементах массива.
Если Вы на самом деле не нуждаетесь в переменных вообще и просто хотите циклично выполниться по строкам вывода команды, то используйте a while
цикл вместо a for
цикл:
while read -r i; do
echo "$i"
done < <(grep -E '##.*bash.*file.*add' bash.kb)