Sida 1 av 1
Bash problem
Postat: 11 feb 2014, 23:22
av torent
sliter mitt hår för att få detta att fungera,
någon ser det uppenbara felet i stycket från "if" och neråt?
den vägrar att göra uträkningarna och publicera resultatet.
Kod: Markera allt
#!/bin/bash
#This script run every 5 seconds
#while (sleep 5 && shell /home/tommy/bin/get_varv.sh) &
#do
# wait $!
#done
soltempframsensor="28.531195040000"
soltempretursensor="28.674495040000"
pumprunningsensor="12.EC0595000000"
RRDDataDirectory="/home/tommy/rrddata/"
RRDDataFile="sol_effekt.rrd"
# Get varv form OWFS
soltempfram=`cat /mnt/1-wire/$soltempframsensor/temperature|sed -e s/" "//g|awk '{$1=$1 + 0.005;printf "%.2f", $1}'`
soltempretur=`cat /mnt/1-wire/$soltempretursensor/temperature|sed -e s/" "//g|awk '{$1=$1 + 0.005;printf "%.2f", $1}'`
pumprunning=`cat /mnt/1-wire/$pumprunningsensor/sensed.B|sed -e s/" "//g|awk '{$1=$1 + 0.005;printf "%.2f", $1}'`
#integer soleffekt (returnerar momentan effekt i watt)
effektkonstant=2
if [[ $pumprunning=0 ]]; then
echo SolEffekt; $[[ "$soltempfram"-"$soltempretur" | bc - l]]
echo SolEffekt; $[[ "$SolEffekt"*"$effektkonstant" | bc - l ]]
else
SolEffekt=0
end;
#Update RRD database
#rrdtool update $RRDDataDirectory$RRDDataFile N:$soleffekt
#echo $soleffekt
rrdtool update $RRDDataDirectory$RRDDataFile N:$SolEffekt
echo $SolEffekt
fi
Re: Bash problem
Postat: 11 feb 2014, 23:36
av Osprey
Det verkar vara ett av de mest klassiska fel som finns, i både bash och C.
...antagligen vill du inte göra en tilldelning av värdet 0 till det som $pumprunning innehåller, så lägg till ett extra "=" där...
Alltså:
Re: Bash problem
Postat: 12 feb 2014, 20:50
av torent
tack för hjälpen!
och då kanske du ser direkt varför min subtraktion och min multiplicering inte fungerar:
get_varv.sh: rad 24: [ "2.07"-"2.07" | bc - l]: syntaxfel: en operand förväntades (felsymbol är "[ "2.07"-"2.07" | bc - l]")
Re: Bash problem
Postat: 12 feb 2014, 22:27
av mcNisse
torent skrev:tack för hjälpen!
och då kanske du ser direkt varför min subtraktion och min multiplicering inte fungerar:
get_varv.sh: rad 24: [ "2.07"-"2.07" | bc - l]: syntaxfel: en operand förväntades (felsymbol är "[ "2.07"-"2.07" | bc - l]")
Jag skrev ett svar igår... men jag postade tydligen inte det
Till att börja med [[ är till för att testa saker inte göra beräkningar eller skicka data till andra program. Du ska använda
echo "$a - $b" | bc istället för ditt uttryck eventuellt kan du lägga till -l till bc om beräkningen kräver det.
Re: Bash problem
Postat: 12 feb 2014, 22:42
av Osprey
Menar du förresten "bc -l" med "bc - l"...?
Felet som uppstår ser i övrigt ut att bero på att awk tolkar talen som strängar och inte som flyttal. Prova med parenteser runt uträkningarna och se om det hjälper...
Re: Bash problem
Postat: 12 feb 2014, 23:12
av torent
ett steg fram och två bakåt,
nu fungerar uträkningen, tack!
men det blir ingen skillnad om jag ställer pumprunning 1 eller 0.
vid 1 ska ju den echoa 0 och vid 0 ska den echoa det uträknade talet,
+ soltempfram=10
++ cat /mnt/1-wire/28.674495040000/temperature
++ sed -e 's/ //g'
++ awk '{$1=$1 + 0.005;printf "%.2f", $1}'
+ soltempretur=1.88
+ pumprunning=1
+ effektkonstant=2
+ [[ -n 1==0 ]]
+ echo 10-1.88
+ bc -l
8.12
root@server1:/home/tommy/bin#
och den andra frågan, hur får jag nu då summan ur den första uträkningen att landa ner i den andra uträkningen?
nu när jag har tagit bort "SolEffekt="
if [[ $pumprunning==0 ]] ; then
echo $"$soltempfram-$soltempretur" | bc -l
echo $"$SolEffekt*$effektkonstant" | bc - l
else
SolEffekt=0
end;
#Update RRD database
#rrdtool update $RRDDataDirectory$RRDDataFile N:$soleffekt
#echo $soleffekt
rrdtool update $RRDDataDirectory$RRDDataFile N:$SolEffekt
echo $SolEffekt
Re: Bash problem
Postat: 12 feb 2014, 23:49
av Osprey
torent skrev:vid 1 ska ju den echoa 0 och vid 0 ska den echoa det uträknade talet,
...om du hade sagt till den att göra det, så hade den kanske gjort det...
Kod: Markera allt
if [[ $pumprunning==0 ]] ; then
echo $"$soltempfram-$soltempretur" | bc -l
echo $"$SolEffekt*$effektkonstant" | bc - l
else
SolEffekt=0
end;
För det första så avsluts inte en if-sats i bash med "
end;", utan med "
fi", så förmodligen begriper den inte alls vad du menar. Sedan har du två echo mellan "
if" och "
else" och båda dessa skrivs alltså ut om villkoret (i
if) är uppfyllt. Mellan "
else" och det som skulle ha varit ett "
fi" har du sedan bara en tilldelning som inte alls syns när du gör den...
Re: Bash problem
Postat: 13 feb 2014, 21:20
av torent
ser att jag blandat "norska och svenska"
är i början av karriären, har hållit på med scriptande sedan nyår så det är en bit kvar...
uttryckte mig lite otydligt också,
det spelar ingen roll om jag sätter pump_running 1 eller 0, den räknar ändå, målet är att den då skall echoa 0 om pump_running=1
tänker mig att det kanske ska se ut såhär istället:
pumprunning=0
#integer soleffekt (returnerar momentan effekt i watt)
effektkonstant=2
if [[ $pumprunning==0 ]] ; then
echo $(("$soltempfram-$soltempretur")*"$effektkonstant") | bc -l
else
echo 0
fi
#Update RRD database
rrdtool update $RRDDataDirectory$RRDDataFile N:$
men det är ändå inte rätt, är ju helt rutten på detta, men jag kämpar på ;-)
Re: Bash problem
Postat: 13 feb 2014, 22:23
av Osprey
Alla har vi varit nybörjare en gång i tiden och den som inte vågar ge sig på det lär sig aldrig något...
Kod: Markera allt
pumprunning=0
#integer soleffekt (returnerar momentan effekt i watt)
effektkonstant=2
if [[ $pumprunning == 0 ]] ; then
# ^ ^
# +--+--------------------- Mellanslag
echo $(("$soltempfram-$soltempretur")*"$effektkonstant") | bc -l
else
echo 0
fi
...mellanslagen är viktiga här och sedan är jag lite tveksam till raden som den ska eka när "$pumprunning == 0", men du får se vad som blir resultatet när du försöker köra. Bland annat så ska du förmodligen inte ha med fnuttarna (") där och lite sådant, men du får se vad som händer...
[Edit] Och norska och svenska får du blanda precis som du vill, det gör inget. Eller iallafall inte så länge det inte finns någon risk att man missuppfattar det...

Re: Bash problem
Postat: 13 feb 2014, 22:39
av torent
strålande bra!
nu fungerar det, den skriver 0 vid pump_running=1 och räknar när pump_running=0
pumprunning=0
#integer soleffekt (returnerar momentan effekt i watt)
effektkonstant=2
if [[ $pumprunning == 0 ]] ; then
echo $soltempfram-$soltempretur | bc -l
nu återstår bara att få in multipliceringen med effektkonstanten,
har du någon fiffig idé?
Re: Bash problem
Postat: 14 feb 2014, 02:51
av Osprey
Jag vet ju inte riktigt hur du vill göra, eller vad du vill ha... men en variant är:
Kod: Markera allt
pumprunning=0
soltempfram=3.14159
soltemperatur=2.71828
effektkonstant=2.00
#integer soleffekt (returnerar momentan effekt i watt)
if [[ $pumprunning == "0" ]] ; then
VALUE=$(echo $soltempfram $soltemperatur $effektkonstant | awk '{ print ($1 - $2) * $3 }')
echo $VALUE
else
echo 1
fi
...och givetvis kan du eka ut resultatet direkt utan tilldelningen till VALUE om du vill...
Re: Bash problem
Postat: 14 feb 2014, 11:21
av torent
Ett jättetack för hjälpen!
det fick bli såhär, nu är det "bara" att laborera med effektkonstanten för att få till en korrekt effektberäkning, bara att vänta på några soliga dagar.
Kod: Markera allt
pumprunning=0
#integer soleffekt (returnerar momentan effekt i watt)
effektkonstant=2
if [[ $pumprunning == 0 ]] ; then
VALUE=$(echo $soltempfram $soltempretur $effektkonstant | awk '{ print ($1 - $2) * $3 }')
else
VALUE=0
fi
#Update RRD database
rrdtool update $RRDDataDirectory$RRDDataFile N:$VALUE
echo $VALUE