Waarom werkt deze bash vergelijking niet?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Saturnus
  • Registratie: Februari 2005
  • Niet online
Ik maak een script om een aantal dingen betreffende storage te automatiseren. Nu moet er aan de hand van de status dat een command terug geeft een actie worden gekozen.

code:
1
2
3
4
5
6
7
8
9
#!/bin/bash

storagestate=`mdadm --detail /dev/md0 | grep "State : "`

if [[ "$storagestate" == "State : clean" ]]
then echo "clean"

else echo "not clean"
fi


Er komt altijd 'not clean' uit terwijl ik weet dat dat niet zo is. Het opvragen van de variabele geeft zelfs exact "State : clean" weer.
Er gaat dus iets fout in de vergelijking of de formaten zijn niet gelijk.
Ik heb al van alles geprobeerd: enkele haken, enkele is gelijk aan, de vergelijkings tekst als variabele, puntkomma achter de haken en if een regel omhoog, enz enz. :?

Acties:
  • 0 Henk 'm!

Anoniem: 296939

Ik kan me vergissen, maar volgens mij gebruik je de verkeerde operator. Ik denk dat je -eq moet gebruiken ipv ==

Edit: nvm, dit is enkel voor binary comparison.

[ Voor 17% gewijzigd door Anoniem: 296939 op 11-04-2013 22:59 ]


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 20:02
Het zit denk ik niet in het 'if' stuk:

code:
1
2
3
> storagestate="State : clean"
> if [[ "$storagestate" == "State : clean" ]]; then echo "clean"; else echo "not clean"; fi
clean

dus mijn conclusie: die string bevat toch niet exact met wat je vergelijkt.
Ik zou die $storagestate eens naar een file dumpen en met "hexdump -C <file>" precies bekijken. Mijn verwachting:
De spaties zijn geen spaties maar tabs o.i.d.,
Of er zit een carriage-return of zo op het eind ingebakken.

Acties:
  • 0 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 00:41

CyBeRSPiN

sinds 2001

-nevermind-

[ Voor 127% gewijzigd door CyBeRSPiN op 11-04-2013 23:13 ]


Acties:
  • 0 Henk 'm!

  • Saturnus
  • Registratie: Februari 2005
  • Niet online
vanaalten schreef op donderdag 11 april 2013 @ 23:06:
Het zit denk ik niet in het 'if' stuk:

code:
1
2
3
> storagestate="State : clean"
> if [[ "$storagestate" == "State : clean" ]]; then echo "clean"; else echo "not clean"; fi
clean

dus mijn conclusie: die string bevat toch niet exact met wat je vergelijkt.
Ik zou die $storagestate eens naar een file dumpen en met "hexdump -C <file>" precies bekijken. Mijn verwachting:
De spaties zijn geen spaties maar tabs o.i.d.,
Of er zit een carriage-return of zo op het eind ingebakken.
Dit lijkt inderdaad zo te zijn!
Nu ik de variabelen ook gequote uitlees heeft de $storagestate een inspring die normaal niet te zien is. Even uitzoeken hoe ik dat er af ga halen.

Acties:
  • 0 Henk 'm!

  • ElMacaroni
  • Registratie: November 2012
  • Laatst online: 23:50

ElMacaroni

Laat de zon maar komen!

Waarom grep je niet op "State : clean" en gebruik de uitkomst hiervan?

SE2200+14xSF170S & SE1500M+4xTSM-375


Acties:
  • 0 Henk 'm!

Anoniem: 26306

CyBeRSPiN schreef op donderdag 11 april 2013 @ 23:09:
== werkt alleen voor nummers, gebruik eq voor strings
We hebben het toch over Bash hè?

== gebruik je dus voor strings, en -eq voor nummers.

Ik zou er overigens van maken:
#!/bin/bash

storagestate="$(/sbin/mdadm --detail /dev/md0 | /bin/fgrep 'State : ' | /usr/bin/awk '{print $3}')"

Defensief programmeren.

Acties:
  • 0 Henk 'm!

  • Saturnus
  • Registratie: Februari 2005
  • Niet online
ElMacaroni schreef op donderdag 11 april 2013 @ 23:16:
Waarom grep je niet op "State : clean" en gebruik de uitkomst hiervan?
Door het greppen blijven er blijkbaar spaties voor en na de tekst zitten.
Voor de geïnteresseerden, hier commands om dat weg te halen: http://stackoverflow.com/...espace-from-bash-variable
Anoniem: 26306 schreef op donderdag 11 april 2013 @ 23:17:
[...]

We hebben het toch over Bash hè?

== gebruik je dus voor strings, en -eq voor nummers.

Ik zou er overigens van maken:
#!/bin/bash

storagestate="$(/sbin/mdadm --detail /dev/md0 | /bin/fgrep 'State : ' | /usr/bin/awk '{print $3}')"

Defensief programmeren.
Dat werkt wel erg mooi. Die ga ik gebruiken. :)

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:25

Hero of Time

Moderator LNX

There is only one Legend

Let ook op je alias. Als je grep gebruikt en je zoekterm wordt met kleur gemarkeerd, dan gaat een exacte string met tabs en spaties e.d. niet werken. De kleur code zit er nog tussen. Dat heb ik iig een aantal keer meegemaakt. Daarom gebruik ik altijd '--color=never' als 't niet helemaal wil zoals ik verwacht.

En uiteraard je variabele echo'en.

Wat ik mij wel afvraag, is waarom je [[ gebruikt, en niet [?

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
Cheatah schreef op donderdag 11 april 2013 @ 23:17:
Ik zou er overigens van maken:
#!/bin/bash

storagestate="$(/sbin/mdadm --detail /dev/md0 | /bin/fgrep 'State : ' | /usr/bin/awk '{print $3}')"
U komt in aanmerking voor de "Useless use of grep" award. ;)
Het valt mij op dat de enige reden waarom men awk gebruikt het selecteren van een veld is.
Terwijl awk zoveel krachtiger is en in elk geval alles kan wat grep kan.
Bash:
1
2
#!/bin/bash
storagestate=$(mdadm --detail /dev/md0 | awk '/State :/{print $3}')

Het gebruik van de volledige padnaam van de tools vind ik wat overdreven. Als reden hebt om te twijfelen aan de waarde van PATH bij scripts die door root uitgevoerd gaan worden (uit het oogpunt van security, een terechte zorg), zet je PATH aan het begin van je script:
Bash:
1
PATH=/sbin:/usr/sbin:/bin:/usr/bin

Scheelt een hoop typewerk en de commando's worden er wat overzichtelijker van.
Tip: bij een assigment van een geïnterpoleerd commando
Bash:
1
x=$(echo a b)

zijn geen quotes nodig om de $() heen.
Pagina: 1