如何将命令的输出存储到数组中,每个值都用双引号引起来

如何将命令的输出存储到数组中,每个值都用双引号引起来

我想将每个输出存储在双引号数组值中。值也可以有空间。

FOUNDFILES=($(locate --database ~/.locate.db -i -b "$INPUT"))

如果locate命令的输入是非常非常最新的(其中非常非常最新的是文件名)。它应该存储为“非常最新”。定位还可以定位其中包含单词very的其他文件。因此,如果存在像 heisvery 这样的其他文件,它也应该像“heisvery”一样存储,其中“veryverylatest”是数组的第 0 个值,“heisvery”是数组的值 1。

答案1

实际上,您实际上需要存储字符串(在变量中)以及不属于数据一部分的前导和尾随引号,这确实是一种罕见的情况。通常最好进行后处理。

var='two  spaces'
printf '# "%s"\n'  "$var"
# "two  spaces"

ary=( 'two  spaces' '$USER' ) 
printf '# "%s"\n'  "${ary[@]}"
# "two  spaces"
# "$USER"

作为locate输出完全合格的路径
-b选项表示仅搜索asename,
你想要仅有的要捕获的基本名称,
然后您可以使用sed它来删除该/pa/th/部分。

当您想要搜索“非常最新”时满的基本名称,
并且您还想搜索“very”任何地方在基本名称中,
那么你真的需要使用正则表达式搜索。

  • -r 搜索基本正则表达式
  • --regex搜索扩展的正则表达式(在下面的示例中使用)

要使您的数组捕获整行,您需要更改​内部F​田地S​分离器(IFS)\n仅。

请注意,数组项在遇到时被捕获/存储定位的输出。为了将它们排列成与数组相同的顺序input,需要对数组进行一些进一步的处理(通过for..grep..loop..awk以下)。

input=( '^very very latest$' 'very' )
IFS=$'\n'; foundfiles=($(locate -i -b --regex "${input[@]}" | sed 's|.*/||'))
foundfiles=($(for((i=0;i<${#input[@]};i++))
              do printf '%s\n' "${foundfiles[@]}" | grep -E "${input[i]}"
              done | awk '!seen[$0]++'))
printf '%s\n' "${foundfiles[@]}"

输出 - 显示完整数组,即索引 [0] 和 [1]:

very very latest
heisvery

如果你想要打印函数输出用引号括起来,只需将最后一行更改为
printf '"%s"\n' "${foundfiles[@]}"

...或者如果您仍然需要将引号添加到数组本身中,请在for..grep..loop

foundfiles=("${foundfiles[@]/#/\"}")
foundfiles=("${foundfiles[@]/%/\"}")

输出 - 显示完整数组,即索引 [0] 和 [1]:

"very very latest"
"heisvery"

答案2

我认为你不想要引号。我认为您只是不想在不是换行符的空白上拆分为字段。

操作方法如下: https://stackoverflow.com/questions/11393817/bash-read-lines-in-file-into-an-array

这是一个例子

$ IFS=$'\n' read -d '' -r -a FOUNDFILES < <(echo -e "very very latest\nsome other line")
$ echo "${FOUNDFILES[0]}" 
 very very latest
$ echo "${FOUNDFILES[1]}" 
 some other line

<(echo -e "very very latest\nsome other line")真的是你的locate命令。

相关内容