Bash problem

Här diskuteras programmering och utveckling
torent
Inlägg: 36
Blev medlem: 11 feb 2014, 23:17
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Bash problem

Inlägg 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
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Bash problem

Inlägg av Osprey »

Det verkar vara ett av de mest klassiska fel som finns, i både bash och C.

Kod: Markera allt

if [[ $pumprunning=0 ]]; then
...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å:

Kod: Markera allt

if [[ $pumprunning==0 ]]; then
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
torent
Inlägg: 36
Blev medlem: 11 feb 2014, 23:17
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Bash problem

Inlägg 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]")
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Bash problem

Inlägg 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.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Bash problem

Inlägg 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...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
torent
Inlägg: 36
Blev medlem: 11 feb 2014, 23:17
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Bash problem

Inlägg 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
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Bash problem

Inlägg 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...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
torent
Inlägg: 36
Blev medlem: 11 feb 2014, 23:17
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Bash problem

Inlägg 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å ;-)
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Bash problem

Inlägg 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... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
torent
Inlägg: 36
Blev medlem: 11 feb 2014, 23:17
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Bash problem

Inlägg 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é?
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Bash problem

Inlägg 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...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
torent
Inlägg: 36
Blev medlem: 11 feb 2014, 23:17
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Bash problem

Inlägg 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
Skriv svar

Återgå till "Programmering och webbdesign"