Bash、grep、整行作为变量

Bash、grep、整行作为变量

问题

我如何将整行输出存储为grep1 个变量,而不是每个字符串。

示例(我只需要 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'

我怎样才能做到这一点?

谢谢。

答案1

你的问题是

for i in $(grep -E '##.*bash.*file.*add' bash.kb); do echo $i; done

迭代空格分隔的在命令输出中。这有时被称为单词拆分或者更一般地拆分 + 统一

你可以将行读入索引数组在 bash 中使用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

注意使用双引号来防止数组元素内的单词分割。


如果你实际上根本不需要变量,而只是想要循环遍历线命令输出,然后使用while循环代替循环for

while read -r i; do
  echo "$i"
done < <(grep -E '##.*bash.*file.*add' bash.kb)

相关内容