【问题标题】:Shell Script not creating an Array ListShell 脚本未创建数组列表
【发布时间】:2017-05-31 06:44:44
【问题描述】:

我需要帮助解决一个奇怪的问题。

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

 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

非常感谢

【问题讨论】:

    标签: arrays linux shell centos


    【解决方案1】:

    我已使用您示例中的代码声明date_final 并初始化date_start 和date_end,在执行您有问题的语句后,我实际上得到了一个数组。

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

    试试这个:

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

    这里的关键是使用+= 运算符,它是追加而不是分配。剩下的只是清理,因为您不需要grep 来过滤数字(计算结果中只有数字),也不需要echo。

    【讨论】:

    • declare -a date_final='()' 是的,我尝试了一切,不,该语句根本不会产生任何错误。在 echo -e ${date_final[@]} 中,只显示第一个元素,而且有 10 多个。
    • 元素不能超过一个。当您执行 $((date_end-date_start)) 计算时,它只产生一串数字。然后你把它输入“grep”,它可能什么都不做,因为你的结果中只有数字开头。然后将其转换为单元素数组。
    • 我想我理解你的问题。没有缩进让我错过了这是一个循环。请查看我的更新答案,将在几分钟后提供。
    • 这个挺有意思的,我试试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多