我的日志文件ala.txt
看起来像这样:
dummy FromEndPoint = PW | dummy | ToEndPoint = LALA | dummy
dummy FromEndPoint = PW | dummy | ToEndPoint = PAPA | dummy
dummy FromEndPoint = WF | dummy | ToEndPoint = LALA | dummy
dummy FromEndPoint = WF | dummy | ToEndPoint = KAKA | dummy
我使用sed
生成一个包含FromEndPoint和ToEndPoint的每个组合的数组。然后我想迭代它。
function main {
file="./ala.txt"
local a=`sed 's/^.*FromEndPoint = \([a-zA-Z\-]*\).*ToEndPoint = \([a-zA-Z\-]*\).*$/\1;\2/' $file | sort -u`
echo ${#a[@]} # prints 1
for connectivity in ${a[@]}; do
echo "conn: $connectivity" # iterates 4 times
#conn: PW;LALA
#conn: PW;PAPA
#conn: WF;KAKA
#conn: WF;LALA
done
}
如果数组中有4个元素,为什么echo ${#a[@]}
会打印1?我怎样才能得到它的实际尺寸?
使用Bash:4.4.12(1)-release
答案 0 :(得分:2)
不要使用变量来存储多行内容,请使用数组!
在bash
shell中,您可以处理替换功能,使命令输出显示为文件内容,供您使用数组进行解析。在bash
及以上4
版本中,命令readarray
and mapfile
可以解析给定分隔符的多行输出,而无需使用带有read
的for循环
#!/usr/bin/env bash
array=()
while read -r unique; do
array+=( "$unique" )
done< <(sed 's/^.*FromEndPoint = \([a-zA-Z\-]*\).*ToEndPoint = \([a-zA-Z\-]*\).*$/\1;\2/' file | sort -u)
现在以echo "${#array[@]}"
打印数组的长度应按预期打印长度。
始终将local
变量的初始化分开并为其分配值。见Why does local
sweep the return code of a command?