Toon posts:

[bash] test command: condition met haakjes werkt niet

Pagina: 1
Acties:

  • terje7601
  • Registratie: september 2009
  • Laatst online: 07-04 10:06
Ik heb volgende condition:

[ 1 -o 0 -a 0 ]


dewelke "true" teruggeeft. Nu wil ik de "-o" eerst laten evalueren, zodat het resultaat "false" is, dus iets als:

[ ( 1 -o 0 ) -a 0 ]


maar dit geeft de foutmelding:

-bash: syntax error near unexpected token `1'


Bij "man test" staat voor het gebruik van haakjes enkel
True if expression is true
maar hier staat dat haakjes gebruikt kunnen worden
to override the normal precedence of operators.
Dus haakjes kunnen gebruikt worden, & ze kunnen gebruikt worden voor wat ik wil (eerst de -o evalueren), maar toch krijg ik een syntax error :?

Wil iemand mij aub uitleggen waarom ik deze error krijg? Alvast bedankt.

PS: mocht het van belang zijn:

bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)

  • swbr
  • Registratie: maart 2009
  • Laatst online: 16-09 13:39
iets als misschien:

code:
1
[ je eerste test ] && [ je tweede test]

If you try and take a cat apart to see how it works, the first thing you have on your hands is a non-working cat. -DNA


  • terje7601
  • Registratie: september 2009
  • Laatst online: 07-04 10:06
ja, maar daarbij roep je (voor zover ik weet) gewoon 2x het "test" programma aan, wat dus eerder een workaround is dan een oplossing voor het probleem, toch?

  • swbr
  • Registratie: maart 2009
  • Laatst online: 16-09 13:39
terje7601 schreef op vrijdag 29 oktober 2010 @ 13:49:
ja, maar daarbij roep je (voor zover ik weet) gewoon 2x het "test" programma aan, wat dus eerder een workaround is dan een oplossing voor het probleem, toch?
Dat klopt, dit zijn twee aparte aanroepen. Maar je bent een bash script aan 't maken en geen C code voor een embedded systeem toch?

If you try and take a cat apart to see how it works, the first thing you have on your hands is a non-working cat. -DNA


  • u_nix_we_all
  • Registratie: augustus 2002
  • Niet online
terje7601 schreef op vrijdag 29 oktober 2010 @ 13:49:
ja, maar daarbij roep je (voor zover ik weet) gewoon 2x het "test" programma aan, wat dus eerder een workaround is dan een oplossing voor het probleem, toch?
Uiteindelijk test je ook 2x natuurlijk, ook als je ze "nest", het zijn hoe dan ook 2 evaluaties.

Qua syntax: Ik weet niet of het gebruik van "(" op die manier gaat werken, maar dit zou wel moeten werken:
code:
1
[ `[ 1 -o 0 ]` -a 0 ]

  • terje7601
  • Registratie: september 2009
  • Laatst online: 07-04 10:06
edit: ok, ondertussen opgelost...of toch niet. Als de haakjes "escaped" worden (met een backslash, enkele of dubbele quotes), krijg ik geen foutmelding meer. Dus:

[ \( 1 -o 0 \) -a 0 ]


werkt gewoon, maar dit geeft dan wel weer "true" terug, terwijl ik "false" verwacht. Dus de vraag wordt dan: waarom geeft bovenstaand cmd true terug :?
Antaresje schreef op vrijdag 29 oktober 2010 @ 13:51:
Dat klopt, dit zijn twee aparte aanroepen. Maar je bent een bash script aan 't maken en geen C code voor een embedded systeem toch?
true :) maar als een programma niet werkt zoals het volgens mij zou moeten werken, wil ik daar graag een logische verklaring voor

[Voor 106% gewijzigd door terje7601 op 29-10-2010 14:14]


  • swbr
  • Registratie: maart 2009
  • Laatst online: 16-09 13:39
Uit de manpage:
Beware that parentheses need to be escaped (e.g., by backslashes) for shells.
Oftwel:

code:
1
[ \( 1 \) -a 0 ]

If you try and take a cat apart to see how it works, the first thing you have on your hands is a non-working cat. -DNA


  • terje7601
  • Registratie: september 2009
  • Laatst online: 07-04 10:06
Antaresje schreef op vrijdag 29 oktober 2010 @ 14:14:
Uit de manpage:


[...]

code:
1
[ \( 1 \) -a 0 ]
Inderdaad, bedankt :) Ik heb de manpage net nog eens doorlopen & kan het niet terugvinden (is het mogelijk dat OS X andere manpages heeft dan Linux?). Nu blijft dus de vraag:

waarom geeft
[ \( 1 -o 0 \) -a 0 ]

true terug?

  • Tim
  • Registratie: mei 2000
  • Laatst online: 24-08 14:09
Test werk met expressions: 1 en 0 zijn geldige expressions (string of integer) en dus altijd true. Oftewel [ 0 -o 0 ] is ook "true". Zo is ook 0==1 true, want dat is een string.
Wat je zoekt is
code:
1
[ \( \( 1 -eq 1 \) -o \( 0 -eq 1 \) \) -a \( 0 -eq 1 \) ]


Bash heeft trouwens ook [[, wat iets minder idioot is (maar niet veel).

[Voor 6% gewijzigd door Tim op 29-10-2010 14:35. Reden: oeps, kan niet lezen]


  • terje7601
  • Registratie: september 2009
  • Laatst online: 07-04 10:06
Ik dacht "laat ik het zo simpel mogelijk maken om te testen", maar dat was dus verkeerd gedacht. Bedankt :)

Die [[ heb ik ondertussen ook teruggevonden (hier), maar alweer: hierover is niets terug te vinden in de manpages. Heeft Mac OS X een beknopte versie van de manpages?

@Antaresje: op welk besturingssysteem stond die quote in de manpage aub?

  • swbr
  • Registratie: maart 2009
  • Laatst online: 16-09 13:39
terje7601 schreef op vrijdag 29 oktober 2010 @ 14:49:
@Antaresje: op welk besturingssysteem stond die quote in de manpage aub?
Zowel op RedHat als op Debian gekeken, staat er bij allebei op.

Edit: En voor de grap even gekeken op een ouwe Solaris 8 bak, zelfs daar staat het in de manpages.

Niet dat het in de manpages van test zou moeten staan trouwens, '(' is een metacharacter in bash (en andere shells ook), dus die moet je altijd escapen, niet alleen bij test.

[Voor 35% gewijzigd door swbr op 29-10-2010 15:04]

If you try and take a cat apart to see how it works, the first thing you have on your hands is a non-working cat. -DNA


  • terje7601
  • Registratie: september 2009
  • Laatst online: 07-04 10:06
Antaresje schreef op vrijdag 29 oktober 2010 @ 15:01:
Zowel op RedHat als op Debian gekeken, staat er bij allebei op.
Lol, en Apple maar opscheppen dat hun OS X "Unix certified" is. Dan mag je m.i. toch op z'n minst volledige manpages verwachten :F maar goed, dat weten we dan ook weer.
Antaresje schreef op vrijdag 29 oktober 2010 @ 15:01:
Niet dat het in de manpages van test zou moeten staan trouwens, '(' is een metacharacter in bash (en andere shells ook), dus die moet je altijd escapen, niet alleen bij test.
Ok, misschien leer ik maar beter eerst de bash basics :)

[Voor 33% gewijzigd door terje7601 op 29-10-2010 15:18]

Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee