Trädvy Permalänk
Medlem
Registrerad
Nov 2016

start stop bash script

halloj! Jag har en uppgift i skolan jag skulle behöva lite hjälp med.

Skriv ett script, timetrack som man kan starta med några olika argument, start, stop samt status och som kan användas för att hålla reda på hur länge du gör något. När scriptet anropas med timetrack start ska aktuell tid sparas undan i en fil i den katalog du är i för tillfället. Med timetrack status ska du visa hur länge sedan det var du startade scriptet i antal sekunder. Med timetrack stop ska tidräkningen avslutas och du ska visa hur länge sedan det var som du anropade timetrack start, även nu enbart i antal sekunder. Nästa gång du anropar scriptet med timetrack start ska tiden 0-ställas och du börjar om från början.

Jag tänker mig nått såhär men skulle behöva lite hjälp..

#!/bin/bash

case "$1" in
start)
echo "script startar. tid: `date +"%s"`" > timefile1
;;

status)
echo "status for script"
if [ -f timefile1 ]
then
let result=`date +"%s"` - `cat timefile1`
echo "script startade for" $result "sekunder sedan"
else
echo "finns ingen status om scriptet"
fi
;;

stop)
echo "script stoppas"

if [ -f timefile1 ]
then
let result=`date +"%s"` - `cat timefile1`
echo " scriptet stoppas och det var" $result "sekunder sedan sciptet startades"
rm timefile1
fi
;;

*)
echo "kor scriptet med: $0 med start, stop eller status"
;;

esac
exit 0

Trädvy Permalänk
Medlem
Registrerad
Jun 2003

Jag förstår hur du tänker, bara lite fel på syntaxen. Du kan inte skriva:
let result=`date +"%s"` - `cat timefile1` eftersom att bash kan inte tolka dina anrop till date och cat så som du skrivit det.

Skippa let helt och istället för att kalla på 'date +"%s"' varje gång, så sätt det som en egen variabel:
date=$(date +"%s")

Sedan kan du kalla på det såhär:
echo $date

Bash kan sköta enkel aritmetik, men jag kommer inte riktigt ihåg syntaxen. Så om du kan få sekunderna från dagens datum och timern printade på skärmen så kan du bara pipa vidare det till programmet bc. Ungefär såhär:

date=$(date +"%s")
cattime=$(cat timefile1)

result=${date}-${cattime}
echo $result | bc

Viktigt med måsvingeparanteserna där vid resultvariabeln, annars kommer bash att tolka det som en variabel och inte två. Jag vill inte hjälpa dig för mycket, för det bästa sättet att lära sig är att nöta, men du är inne på rätt spår. Jag tror att tanken är att du ska kunna lösa det utan att pipa till bc. Lycka till

We are the music makers, and we are the dreamers of dreams.
Youtube | Spotify Playlists | Soft | Rapp | Rytm | Kött | Kalas |

Trädvy Permalänk
Medlem
Registrerad
Nov 2016

@Cloudstone: Tack för tipsen! helt rätt att man ska nöta, det kan jag säga att jag har gjort idag!

Trädvy Permalänk
Medlem
Plats
~
Registrerad
Jul 2001

Nu är ju smaken som baken. Själv avskyr jag case-satser, men vissa tycker att de underlättar läsningen.

Oavsett, tänk på att återanvända kod. Skriver du något mer än en gång, bryt ut det om möjligt. Du använder "date +%s" flera gånger. Det är förvisso ett tämligen kort kommando att skriva, men antag nu att det hade varit ett längre kommando med en massa formattering av output ... Du vill även skriva ut hur länge sedan det var skriptet startades i flera cases, kanske ska det vara något som alltid körs om vi inte avbryter tidigare?

Jag skulle nog göra något i stil med:

#!/bin/bash tid=`date +%s` args=("start" "stop" "status") error_msg () { echo -e "${1}" exit 1 } [[ ! " ${args[@]} " =~ " ${1} " ]] && error_msg "Felaktig syntax." [[ $1 == start ]] && echo $tid > time.tmp && exit 0 [[ ! -f time.tmp ]] && error_msg "Log saknas. Starta scriptet (${0} start) först." echo "Scriptet startade för $(($tid - `cat time.tmp` )) sekunder sedan." [[ $1 == status ]] && exit 0 echo "Scriptet stoppas." && rm time.tmp

Fedora, i3wm, Ansible, Vim, git, LaTeX - allt som behövs för att göra mig nöjd.