我有一个bash脚本,该脚本将bash数组分成两对,并在任何一个元素上匹配;
declare -a arr=(
"apple" "fruit"
"cabbage" "vegetables"
)
for ((i=0; i<${#arr[@]}; i+=2)); do
echo "${arr[i]} ${arr[i+1]}"
done
因此,当您运行此脚本时,它将像这样从数组中打印出每个2个元素;
# bash script
apple fruit
cabbage vegetables
并且我还可以使用${arr[i+@]}
选择我想要的任何元素。
现在,我正尝试从一个单独的文本文件中读取此数组,而不是从脚本中读取该数组,因为以后将要处理此数组。
到目前为止,我已经尝试过这种方法,起初看起来很有希望,但是根本没有用;
filename='stuff.log'
filelines=`cat $filename`
for line in $filelines ; do
props=($line)
echo "${props[0]} ${props[1]}"
done
应该会在控制台中打印出以下内容(基本上与第一个脚本相同,即数组位于脚本内部),但实际上,它什么也不返回。
# bash script
apple fruit
cabbage vegetables
stuff.log
的内部是;
"apple" "fruit"
"cabbage" "vegetables"
我基本上如何从第一个脚本的单独文件中读取数组,并且将来还能操纵数组文件的内容?
答案 0 :(得分:1)
我认为,如果您信任您的输入,可以这样做:
IFS=' \n' eval props=($(<stuff.log))
Eval是邪恶的,可以在那里删除前导"
和尾随"
。它会正确地解析包含空格的元素。通过将文件读入数组,然后删除开头和结尾的IFS=' \n' props=($(<stuff.log))
IFS='\n' props=($(printf "%s\n" "${props[@]}" | sed 's/^"//;s/"$//'))
,我们可以做得更安全一些:
"
无论如何,我想我会在生产代码中犹豫使用这种方法。最好编写一个适当的完全解析器,将mapfile
考虑在内并逐字符读取输入字符。
如果要读取一个文件到一个数组,使用readarray
或dotnet new mvc
命令(它们是完全一样的命令)。