Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Curl vraagje

Pagina: 1
Acties:

  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 21:57
Ik ben echt totale noob als het gaat over scripting etc.

Nu zat ik wat te prutsen met een Pushover curl script.
Ik had het script van internet geplukt, en aangepast zodat ik de melding kreeg hoe warm de cpu is. Dit werkt allemaal.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! /bin/sh
# Script by aus
# Adjustments for Pushover by Zettt
# Requirements: curl
# Usage: ./pushover.sh message title url url_title priority device'
# Example: ./pushover.sh "this is a test" "test title" "http://github.com" "GitHub" 0 "iPad"'
# Note: All parameters except message are optional'

app="Application Name"
message=$1
title=$2
url=$3
url_title=$4
priority=$5
device=$6
sound=$7
userkey=Mijnuserkey
apikey=mijnapikey


# Get current private IP address for eth0
PRIVATE=$( /opt/vc/bin/vcgencmd measure_temp | grep "temp=" | awk '{ print $1 }')
PRIVATE=${PRIVATE}

if [ $# -lt 1 ]; then
    echo 'prowl'
    echo 'Usage: ./pushover.sh message title url url_title priority device'
    echo 'Example: ./pushover.sh "this is a test" "test title" "http://github.com" "GitHub" 0 "iPad"'
    echo 'Note: All parameters except message are optional'
else
    curl https://api.pushover.net/1/messages.json -F token=$apikey -F user=$userkey -F message=$PRIVATE -F title="$title" -F url="$url" -F url_title="$url_title" -F priority="$priority" -F device="$device" -F sound=magic
fi


Maar nu wil ik dat als de tempratuur hoger is dan zeg maar 44 graden, dat die dan een push message doet.

Nu weet ik dat ik dan iets moet doen met " if $PRIVATE > "temp=44.1'C" " then -> ofzoiets.

Kan iemand me op de goede weg helpen?

De output van /opt/vc/bin/vcgencmd measure_temp is het volgende "temp=47.1'C"

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
je wilt dus alleen de curl uitvoeren als je temp > 44.1C

even dit lezen: http://www.dreamsyssoft.c...pting/ifelse-tutorial.php

  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 21:57
steffex schreef op woensdag 08 mei 2013 @ 12:18:
je wilt dus alleen de curl uitvoeren als je temp > 44.1C

even dit lezen: http://www.dreamsyssoft.c...pting/ifelse-tutorial.php
Toevallig had ik die pagina al gevonden. Maar daar haal ik niet zo 1-2-3- uit hoe ik het moet gebruiken in mijn situatie

Is het script van eigen slim genoeg om te snappen dat het alleen bij het aangegeven getal het script moetuitvoeren? Aangezien de hele output regel "temp=47.1'C" is.

Hoe filter ik dan de temp=xx.x'C weg?

  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 27-10 16:12
Neem deze code eens op achter je awk commando
code:
1
sed 's/[^0-9\.]*//g'


Totaal regel:
code:
1
PRIVATE=$( /opt/vc/bin/vcgencmd measure_temp | grep "temp=" | awk '{ print $1 }' | sed 's/[^0-9\.]*//g' )


Als het goed is krijg je dan alleen 44.1 uit.
Alleen bash doet niets met floats (44.1) alleen met int's (44) dus vergelijken wordt nog wat lastig.

edit:
Je zou een programma als "bc" kunnen gebruiken:
code:
1
2
3
4
ALARM=`echo "44.1 < ${PRIVATE}" | bc`
if [ $ALARM -eq 1]; then
    # Hier komt je code als de temperatuur te hoog is.
fi

[ Voor 38% gewijzigd door CyberJack op 08-05-2013 12:53 ]

https://bottenberg.dev


  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 21:57
cyberjack77 schreef op woensdag 08 mei 2013 @ 12:38:
Neem deze code eens op achter je awk commando
code:
1
sed 's/[^0-9\.]*//g'


Totaal regel:
code:
1
PRIVATE=$( /opt/vc/bin/vcgencmd measure_temp | grep "temp=" | awk '{ print $1 }' | sed 's/[^0-9\.]*//g' )


Als het goed is krijg je dan alleen 44.1 uit.
Alleen bash doet niets met floats (44.1) alleen met int's (44) dus vergelijken wordt nog wat lastig.

edit:
Je zou een programma als "bc" kunnen gebruiken:
code:
1
2
3
4
ALARM=`echo "44.1 < ${PRIVATE}" | bc`
if [ $ALARM -eq 1]; then
    # Hier komt je code als de temperatuur te hoog is.
fi
sed 's/[^0-9\.]*//g' -> dat werkte, ik krijg er alleen een getal uit. Maar echt werken deed het script idd nog niet. Ik ga verder met je edit, even kijken of dat wil werken.

  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 27-10 16:12
Dacuuu schreef op woensdag 08 mei 2013 @ 12:55:
sed 's/[^0-9\.]*//g' -> dat werkte, ik krijg er alleen een getal uit. Maar echt werken deed het script idd nog niet. Ik ga verder met je edit, even kijken of dat wil werken.
De regex [^0-9\.] verwijderd alle niet cijfers of punten van de string. Als er alleen stond temp=38'C krijg je inderdaad alleen 38 uit.

De regel van het bc commando werkt dan nog steeds.
Eigenlijk staat er dan
code:
1
echo "44.1 < 38" | bc

44.1 is niet kleiner dan 38 en dus zal er er geen actie ondernomen worden.

https://bottenberg.dev


  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 21:57
cyberjack77 schreef op woensdag 08 mei 2013 @ 12:58:
[...]


De regex [^0-9\.] verwijderd alle niet cijfers of punten van de string. Als er alleen stond temp=38'C krijg je inderdaad alleen 38 uit.

De regel van het bc commando werkt dan nog steeds.
Eigenlijk staat er dan
code:
1
echo "44.1 < 38" | bc

44.1 is niet kleiner dan 38 en dus zal er er geen actie ondernomen worden.
Werken doet het nog niet, zoveel nieuwe dingen voor mij vandaag :)

De normale temp is gemiddeld 46.5 graden. Als de cpu 55 graden wordt wil ik een berichtje krijgen.

Nu heb ik de code zo gepassd


code:
1
2
3
4
5
6
7
8
9
10
PRIVATE=$( /opt/vc/bin/vcgencmd measure_temp | grep "temp=" | awk '{ print $1 }' | sed 's/[^0-9\.]*//g' )
PRIVATE=${PRIVATE}

ALARM=`echo "44.1 < ${PRIVATE}" | bc`
if [ $ALARM -eq 1]; then
curl https://api.pushover.net/1/messages.json -F token=$apikey -F user=$userkey -F message=$PRIVATE -F title=$

else echo 'Error!'

fi


Wat die ALARM doet , weet ik nog niet.

Alarm = 44.1 kleiner dan PRIVATE
als alarm equal to 1 is, dan -> uitvoeren van die curl regel.
anders -> echo 'Error!'

Zit ik op de goede weg?

Bij het uitvoeren krijg ik het volgende
"./script: 1: ./script: bc: not found
./script: 26: [: missing ]
"

  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 27-10 16:12
ALARM en PRIVATE zijn 2 variable (niet meer dan een eigen gegeven naam)
Ze worden meestal met hoofdletters geschreven zodat ze duidelijk te herkennen zijn

In ALARM wordt de uitkomst van de echo | bc regel gezet.
Als hier 1 in staat moet er actie ondernomen worden. Staat er 0 is gebeurd er niets.

de melding "bc: not found" betekend dat het bc programma niet geinstaleerd is.
Die kan je installeren of een ander programma zoeken :)

Mocht je een ubuntu of debian linux gebruiken kan je bc met dit commando installeren:
code:
1
sudo apt-get install bc

https://bottenberg.dev


  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 21:57
Ondertussen BC geïnstalleerd.

Error dat BC niet geïnstalleerd is is nu weg.
de 2e error nog niet.

./script: 26: [: missing ]

  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 27-10 16:12
en wat staat er op regel 26?

https://bottenberg.dev


  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 21:57
if [ $ALARM -eq 1]; then

  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 27-10 16:12
ah, verkeerd geplakt :)
er moet een spatie tussen de 1 en het ] teken.

https://bottenberg.dev


  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 21:57
cyberjack77 schreef op woensdag 08 mei 2013 @ 15:05:
ah, verkeerd geplakt :)
er moet een spatie tussen de 1 en het ] teken.
Yes het werkt! O dom natuurlijk, ik las er zelf gewoon glad overheen!

Van het script een cronjob gemaakt, en het werkt. Even de cpu stessed..en ja hoor. Krijg een berichtje!

Nu snap ik nog wat dingen niet.

Je vertelde "Alleen bash doet niets met floats (44.1) alleen met int's (44) dus vergelijken wordt nog wat lastig."

Dus met een "." is het een float, en zonder punt is het een "int" ?

En "BC" is een command line calculator?
Ik ben wat aan het uitproberen met bc
echo 10/3 | bc uitkomst: 3
echo 10/3 | bc -l uitkomst: 3,3333333333

Weer wat geleerd!


Even je zinnen ontleden:
ALARM=`echo "55 < ${PRIVATE}" | bc`

Alarm is dus een zelf aangemaakte variable. Maar waarom gebruik je daar een "echo"?
Ik heb er nu neergezet
ALARM=`echo "55 < ${PRIVATE}" | bc`
Als de cpu boven de 55 graden komt werkt het script.

Maar ik zie: 55 < ${PRIVATE}. Ik zelf zou zetten: ${PRIVATE} > 55 -> run script. waarom kan dat niet?
EDIT: Snap hem. De uitkomst van deze regel is altijd 0 of 1. Vandaar :)

[ Voor 74% gewijzigd door Dacuuu op 08-05-2013 16:00 ]


  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 27-10 16:12
Dacuuu schreef op woensdag 08 mei 2013 @ 15:10:
Nu snap ik nog wat dingen niet.

Je vertelde "Alleen bash doet niets met floats (44.1) alleen met int's (44) dus vergelijken wordt nog wat lastig."

Dus met een "." is het een float, en zonder punt is het een "int" ?
Een float is een getal met een waarde achter de comma (of punt). Een int(eger) is een geheel getal.
Bash kan met zijn if vergelijkingen alleen int's of strings vergelijken (dus geen floats, die worden gezien als string). Aangezien je wilt controleren of een getal kleiner is dan een ander getal kan dit alleen met int's. Gezien je een string terug krijgt en geen int (en je string bevat een float waarde) zal je dus een externe tool moeten gebruiken.
Dacuuu schreef op woensdag 08 mei 2013 @ 15:10:
En "BC" is een command line calculator?
Ja, dat is inderdaad een soort van commandline calculator. Het is eigenlijk een calculator language want je kan er meer mee doen dan een simpele berekening.
Dacuuu schreef op woensdag 08 mei 2013 @ 15:10:
Even je zinnen ontleden:
ALARM=`echo "55 < ${PRIVATE}" | bc`

Alarm is dus een zelf aangemaakte variable. Maar waarom gebruik je daar een "echo"?
De echo wordt gedaan omdat je iets (in dit geval een string) door wilt sturen naar het bc commando.
Hiervoor heb je output nodig en echo zorgt voor de output.
Dacuuu schreef op woensdag 08 mei 2013 @ 15:10:
Maar ik zie: 55 < ${PRIVATE}. Ik zelf zou zetten: ${PRIVATE} > 55 -> run script. waarom kan dat niet?
Dit kan wel. Het andersom schrijven doe ik al heel lang en komt doordat ik ooit lang naar een probleem in php aan het zoeken geweest ben. Als je bij php in een if een = vergeet vind php het gewoon goed, maar als ik het andersom schrijf krijg ik een error. Dus je hiermee voorkom ik het vergeten van een = in een if constructie. Niet iedere taal ondersteund dit geloof ik.

[ Voor 5% gewijzigd door CyberJack op 08-05-2013 17:04 ]

https://bottenberg.dev


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23-11 03:08
Als je er vanuit gaat dat de temperatuur altijd tussen de 10 en 99 graden zit kun je natuurlijk ook wel de string-operaties gebruiken. ;)

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 00:06
code:
1
PRIVATE=${PRIVATE}
is vrij nutteloos.

En hoewel het misschien makkelijk is om eerst alles in kleine stapjes op te delen, heb je niet die hele pipeline nodig. awk kan bijvoorbeeld ook prima matchen:
code:
1
/opt/vc/bin/vcgencmd measure_temp | awk '/temp=/ { print $1 }' | sed 's/[^0-9\.]*//g'

En i.p.v. awk gebruiken om alleen de eerste kolom te printen, kun je ook de regex iets aanpassen om de rest van de regel weg te laten. Als je sed dan ook nog alleen laat printen wanneer die regex match, kun je awk ook weglaten:
code:
1
/opt/vc/bin/vcgencmd measure_temp | sed -n 's/temp=\([0-9.]\+\).*$/\1/p'

Je zei echter ook
Dacuuu schreef op woensdag 08 mei 2013 @ 12:12:
De output van /opt/vc/bin/vcgencmd measure_temp is het volgende "temp=47.1'C"
Als dat echt de enige output is, kun je volstaan met de eerste sed-expressie, dus zonder grep en awk.
Pagina: 1