簡體   English   中英

修改bash數組中的元素

[英]Modifying elements in bash array

我有一個數組${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

有人看到我在這里缺少什么嗎,還是有更好的方法來減去時間。

要將元素添加到數組,請使用+=運算符:

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

或將元素設置為給定的索引:

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

這相差很多時間-我不建議將其用於大量值,但絕對比循環運行日期好

# 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

遍歷數組元素通常比嘗試構造索引要容易得多:

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 ,該計算器計算每行的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM