[bash] boolean doorgeven aan een functie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Demo
  • Registratie: Juni 2000
  • Laatst online: 30-09 11:31

Demo

Probleemschietende Tovenaar

Topicstarter
Omdat er in wat scriptjes voor een embedded project nogal wat herhaling bleek te zitten, ben ik begonnen met functies maken van veel gebruikte code. Het lukt me alleen niet om een boolean door te geven aan een functie. Ik heb het volgende test-script:
Bash:
1
2
3
4
5
6
7
8
9
10
#!/bin/bash

testfunc() {
  [ $1 = "foo" ] && return 0 || return 1
}

testfunc "foo" && echo OK || echo FAIL # output is OK
testfunc "bar" && echo OK || echo FAIL # output is FAIL

exit 0

Tot zover gaat het goed. Ik wil echter de && echo OK || echo FAIL ook in een functie gieten en dat gaat niet helemaal lekker. Om fouten in testfunc() uit te sluiten heb ik de input van mijn functie vervangen door true en false.
Bash:
1
2
3
4
5
6
7
8
9
10
#!/bin/bash

status() {
  $1 && echo OK || echo FAIL
}

status $(true) # output is OK
status $(false) # output is ook OK?

exit 0

Voor mijn gevoel zou $1 in deze functie een boolean moeten bevatten, maar dat blijkt niet het geval. $1 tussen brackets zetten levert juist altijd een false op. Zie ik hier iets over het hoofd?

Unix doesn't prevent a user from doing stupid things, because that would necessarily prevent them from doing brilliant things.
while true ; do echo -n "bla" ; sleep 1 ; done


Acties:
  • 0 Henk 'm!

  • bronce
  • Registratie: Januari 2011
  • Laatst online: 27-09 12:58
true en false zijn geen boolean types maar functies. true gaat altijd goed, false altijd fout.

http://linux.die.net/man/1/false

[ Voor 16% gewijzigd door bronce op 25-05-2014 12:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je bent nu eigenlijk exit codes aan het bekijken. Gebruik dus $?
Bash:
1
2
3
4
5
6
7
8
9
10
#! /bin/bash

status() {
  [ $? -eq 0 ] && echo "OK" || echo "FAIL"
}

$(true); status
$(false); status

exit 0

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 00:13
De commando's true en false geven een exit code resp. gelijk en ongelijk aan 0 terug, maar ze produceren geen output, dus $(true) en $(false) zijn lege strings. Met
Bash:
1
$1 && echo OK || echo FAIL
gebruik je die lege string als commando in een pipeline. Ik kan het verschil tussen $1 met of zonder quotes (wat voor brackets bedoelde je precies?) niet precies uitleggen, maar zonder quotes lijkt het als speciaal geval behandeld te worden (wat dus true geeft) en met krijg je "command not found" omdat je het commando "" probeert uit te voeren.

Je kunt dus het commando zelf als parameter meegeven -- of als meerdere parameters zoals met sudo -- en het dan binnen je functie uitvoeren om de return value te checken:
Bash:
1
2
3
status () {
  "$@" && echo OK || echo FAIL
}

Acties:
  • 0 Henk 'm!

  • Demo
  • Registratie: Juni 2000
  • Laatst online: 30-09 11:31

Demo

Probleemschietende Tovenaar

Topicstarter
bronce schreef op zondag 25 mei 2014 @ 12:29:
true en false zijn geen boolean types maar functies. true gaat altijd goed, false altijd fout.

http://linux.die.net/man/1/false
Functies die booleans uitpoepen, toch? (typische Unix-humor trouwens, de man-pages van die twee :+)

Cheatah en Raynman bedankt! Soms zit je gewoon klem in een manier van denken, beide oplossingen werken maar die van Cheatah is bruikbaarder in mijn scripts.

Unix doesn't prevent a user from doing stupid things, because that would necessarily prevent them from doing brilliant things.
while true ; do echo -n "bla" ; sleep 1 ; done


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 21:30

Hero of Time

Moderator LNX

There is only one Legend

Moet het een boolean wezen, of mag het ook een variabele zijn die twee mogelijke waardes heeft? Want daarmee kan je ook werken. Bovenaan je script definieer je 'm (var="") en je vult 'm telkens met een van de twee waardes die je wilt (0/1 of true/false). Aan het einde van de functie geef je 't de waarde die 't moet zijn en verderop in het script wordt die waarde uitgelezen, totdat je 'm weer verandert met je functie.

Commandline FTW | Tweakt met mate

Pagina: 1