2017-01-16 99 views
0

我需要帮助解决一个奇怪的问题。Shell脚本未创建阵列列表

这行不创建数组列表,我不知道为什么。

date_final=($(echo $((date_end-date_start)) | grep -o "[0-9].*")) # PROBLEM 

整个代码是下面,特定的阵列的错误的日期转换成一个新的日期,但它应该是一个数组列表,并创建一个单可变代替。

#! /bin/bash 

cd /var/lib/zabbixsrv/externalscripts/Manager 
rm Unique.txt 
declare -a date_final='()' 
total_count=$(cat amazon.html 2>/dev/null | jq '.meta.total_count' | grep -o "[^\"]*") 

i=0; 
for i in $(seq 0 $total_count) 
do 
#compare=($(cat amazon.html 2>/dev/null | jq ".objects[$i].service_tag" | tr ' ' '\n')) 
compare=($(cat amazon.html 2>/dev/null | jq ".objects[$i].conference" | grep -o "[^\"]*" | tr ' ' '\n')) 
echo -e ${compare[@]} >> /var/lib/zabbixsrv/externalscripts/Manager/Unique.txt 
done 

compare1=($(cat Unique.txt | uniq -c | gawk '$1==1{print $2}')) 

Number_line=$(echo ${#compare1[@]}) # PROBLEMA RESOLVIDO!!!! 

let Number_line-=1 


#echo -e ${compare[@]} 

for i in $(seq 0 $Number_line) 
do 

#time=$(cat amazon.html 2>/dev/null | jq '.objects[] | select(.service_tag=='${compare1[$i]}')' | jq ".connect_time" | grep -o "[^\"]*" | grep -o "[^T][0-9].*" | grep -o "[0-9]\{2\}:[0-9]\{2\}:[0-9].") 
time=$(cat amazon.html 2>/dev/null | jq '.objects[] | select(.conference=='${compare1[$i]}')' 2>/dev/null | jq ".connect_time" | grep -o "[^\"]*" | grep -o "[^T][0-9].*" | grep -o "[0-9]\{2\}:[0-9]\{2\}:[0-9].") 
#echo -e ${compare1[$i]} 
date_convert=$(date -d "$time 2 hour ago" +"%H:%M:%S") 
date_start=$(date -d "$day $date_convert" +%s) 
date_end=$(date +"%s") 
date_final=($(echo $((date_end-date_start)) | grep -o "[0-9].*")) # PROBLEM 
done 
# rm Tenant.txt 
#echo ${date_final[0]} 
#echo -e ${date_final[@]} 

tempo=1 
i=0 
echo -e $Numero_linha 
echo -e ${date_final[@]} 


for i in $(seq 0 $Number_line) 
do 

if ((${date_final[$i]} > $tempo)) 2>/dev/null; then 
     echo -e ${compare1[$i]} 
fi 
done 

非常感谢

回答

2

我用的代码从你的例子声明date_final和初始化date_startdate_end,并执行您的问题声明后,我居然得到一个数组。

我认为你的问题是你反复将一个元素的数组分配给你的变量而不是添加元素。

试试这个:

date_final+=($((date_end-date_start))) 

这里的关键是usine的+=运营商,其中追加的而不是分配。其余的只是清理,因为您不需要grep来筛选数字(计算结果中只有数字),并且也不需要echo

+0

declare -a date_final ='()' 是的,我尝试了一切,没有声明不会产生任何erros。 在echo -e $ {date_final [@]}中,只有fisrt元素显示,并且有超过10个。 – Daniel

+0

不能有多个元素。当您执行$((date_end-date_start))计算时,它只产生一个数字串。然后,将它输入“grep”,这可能什么都不做,因为结果中只有数字。然后这变成一个单元数组。 – Fred

+0

我想我理解你的问题。由于没有缩进,我错过了这个循环。请看我的更新答案,几分钟后出来。 – Fred