Bash:摆脱每个数组成员周围引号的本机方法

Bash:摆脱每个数组成员周围引号的本机方法

我从另一个脚本读取了一个数组。" "由于某些成员为空,因此该数组需要放置所有数组成员。

in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
    echo ${vector[index]}
done

问题是我在每个输出行周围都有引号,我想删除它们。

"red"
"blue"
"green"
""
"white"
"black"

必须更改为:

red
blue
green

white
black

我寻找一种不使用awktrsed任何其他基于管道的方法的方法。我只想使用本机方式解决问题,例如使用括号、不同的标点符号,......

答案1

这可能有效:

in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
    echo ${vector[index]//\"/}
done

参考:http://www.tldp.org/LDP/abs/html/refcards.html#AEN22828

答案2

readdata.sh如果生成换行符分隔的数据,并且没有额外的引号,您将使您的程序更简单、更健壮。

在当前程序中, 的输出readdata.sh在空格处分割(因此例如"a b"结果为两个数组元素"ab"),并且每个结果单词被解释为通配符模式(因此例如"a * b"结果为"a,然后是当前目录中的文件名,最后是b") 。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?更多细节。

Bash 提供了一种非常简单的方法来读取换行符分隔的数据:mapfile内置。由于 bash 在子 shell 中执行管道的右侧,因此您不能只编写./readdata.sh 0 "$in_file" | mapfile -t vector,您必须将变量的使用放在命令块中,或者您可以使用进程替换:

in_file=./data
mapfile -t vector < <(./readdata.sh 0 "$in_file")
for index in "${!vector[@]}"
do
  echo "$index: ${vector[index]}"
done

如果您不使用索引,仅使用元素,则迭代数组的更简单方法是

for element in "${vector[@]}"
do
  echo "$element"
done

答案3

由于您更喜欢单衬,

vector=("${vector[@]//\"/}")

请记住,文本替换可以适用于整个数组。

答案4

如果您想避免“hacky”搜索和替换解决方案,使用eval似乎可以完成这项工作:

vector=( $(eval echo ${vector[@]}) )

这会导致 shell 将它们解释为 的带引号的参数echo,从而删除引号。当然,上面的行仍然存在空格问题,但这里的关键点是使用eval.

相关内容