我从另一个脚本读取了一个数组。" "
由于某些成员为空,因此该数组需要放置所有数组成员。
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
我寻找一种不使用awk
、tr
或sed
任何其他基于管道的方法的方法。我只想使用本机方式解决问题,例如使用括号、不同的标点符号,......
答案1
这可能有效:
in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
echo ${vector[index]//\"/}
done
答案2
readdata.sh
如果生成换行符分隔的数据,并且没有额外的引号,您将使您的程序更简单、更健壮。
在当前程序中, 的输出readdata.sh
在空格处分割(因此例如"a b"
结果为两个数组元素"a
和b"
),并且每个结果单词被解释为通配符模式(因此例如"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
.