Minulla on toimiva scripti, jonka haluan muunta dashin hyvkäsymään muotoon. Siinä on yksi kohta, jota en saa muunnettua. Ongelma koskee sitä, miten date-komentoa käytetään.
Bash-muodossa ongelmakoodi on tämän tapainen (olen tehnyt tästä erillisen komentotiedosto testaamista varten):
fmt_time () {
days=$(( $1 / (24*20*60) ))
[ $days -ge 1 ] && printf "$days days, "
printf $(date -u -d @$1 +%T)
}
lasted () {
fmt_time $(( $(date -d "$2" +%s) - $(date -d "$1" +%s) ))
}
log='
Started: 05:39:22 AM 23/06/2021
Stopped: 05:40:53 AM 23/06/2021
'
sta=( $(sed -n -e 's/^.*Started: //p'<<<$log) )
sto=( $(sed -n -e 's/^.*Stopped: //p'<<<$log) )
echo Lasted $(lasted $sta $sto)
Tämä siis toimii kun sen suorittaa bashillä. Alunperin yritin poimia molemmat aikaleimat samaan array-muuttujaan ja kun erotin ne eri muuttujiin, array jäi käyttöön ihan epähuomiossa. Kun sitten yritin muuntaa tämän dashin hyväksymään muotoon, kävi ilmi että date hyväksyy nämä aikaleimat vain array-tyyppisinä mutta ei merkkijonoina.
Oletin että kolme viimeistä riviä pitäisi kirjoittaa näin:
sta=$(echo "$log" | sed -n -e 's/^.*Started: //p')
sto=$(echo "$log" | sed -n -e 's/^.*Stopped: //p')
echo Lasted $(lasted "$sta" "$sto")
Vaan eipä tämä toimi edes bashissä, kun
en tiedä miten nuo aikaleimat pitäisi muuntaa date:a varten.
Löytyykö vinkkiä?
Edit: siistin koodiesimerkkiä (ensimmäinen blokki yllä). Myös siistitty versio on testaamalla toimivaksi todettu.