【问题标题】:Modifying elements in bash array修改bash数组中的元素
【发布时间】:2017-01-04 06:46:05
【问题描述】:

我有一个数组${timearray[*]},其中包含这种格式的多次

20:56 20:57 20:59 21:01 21:04

第二个数组${productarray[*]} 包含不同的时间

20:54 20:56 20:58 21:00 21:02

我需要通过减去时间减去产品来获得两者之间的差异。为此,我相信我需要在减去之前将这些时间转换为纪元时间,然后除以 60 并四舍五入到最接近的分钟。我尝试使用这样的 for 循环进行转换。

arraylength=`expr ${#timearray[@]} -1`
for ((l=0; l<=$arraylength; l++))
do
    epochtimearray=(`date --date="${timearray[$l]}" +%s`)
done

然而生成的 epochtimearray 只包含最后一次的 epoch 值

echo ${epochtimearray[*]}
1472331840

有没有人看到我在这里遗漏了什么,或者有没有更好的方法来减去时间。

【问题讨论】:

  • 如果你只有几个小时+分钟(同一天或者不完整),我真的不明白为什么你需要使用纪元
  • 我相信当 timearray 的一个元素已经翻转到 00:00 而 productarray 的相应元素仍然在 23:59 时会导致错误的结果。

标签: arrays bash loops for-loop epoch


【解决方案1】:

要将元素添加到数组中,请使用+= 运算符:

epochtimearray+=(`date --date="${timearray[$l]}" +%s`)

或在给定索引处设置元素:

epochtimearray[l]=(`date --date="${timearray[$l]}" +%s`)

【讨论】:

  • 左边应该是$l
  • @Jean-FrançoisFabre 不正确,数组索引始终是算术上下文,因此它们不需要 $
  • 谢谢!这行得通。我忘记在循环中指定数组的哪个元素。每次迭代都会覆盖一个元素,只留下最后一次迭代作为唯一元素。现在说得通了。
【解决方案2】:

这有很多差异 - 我不推荐它用于大量值,但它绝对比在循环中运行日期更好

# populate couple arrays
declare -a timearray=(20:56 20:57 20:59 21:01 21:04)
declare -a productarray=(20:54 20:56 20:58 21:00 21:02)

# convert multiple times for today into epoch seconds
IFS=$'\n'
timeepochs=($(echo "${timearray[*]}"|date -f- +%s))
prodepochs=($(echo "${productarray[*]}"|date -f- +%s))
unset IFS
for ((i=0; i < ${#timeepochs[*]}; ++i)); do
  echo "$i: ${timearray[i]} - ${productarray[i]} = $((timeepochs[i] - prodepochs[i])) seconds"
done

【讨论】:

    【解决方案3】:

    循环遍历数组元素通常比尝试构造索引要容易得多:

    for d in "${timearray[@]}"; do
      epochtimearray+=($(date "$d" +%s))
    done
    

    但是,如果您使用的是 Gnu grep(显然您是),您可以使用 -f 选项通过一次调用来处理所有时间:

    epochtimearray=($(date +%s -f-<<<"$(IFS=$'\n'; echo "${timearray[*]}")"))
    

    但您实际上并不需要构造临时数组;您可以使用几个标准的 Unix 实用程序将整个事情放在一起:

    paste -d- <(date +%s -f-<<<"$(IFS=$'\n'; echo "${timearray[*]}")") \
              <(date +%s -f-<<<"$(IFS=$'\n'; echo "${productarray[*]}")") |
    bc
    

    它使用paste 将两个列表组合成两个由破折号分隔的垂直列 (-d-),然后将结果行(看起来很像减法:))输入计算器 bc,其中计算每一行的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-21
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      相关资源
      最近更新 更多