Toon posts:

[BASH] Variablen setten door functieaanroep met backquotes

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil graag
- een functie definiëren
- binnen die functie een global variable kunnen setten
- deze functie aanroepen binnen een statement met backquotes

Onderstaade functie getFruit () zelf werkt wel. Als je hem los aanroept dan wordt bonusFruit netjes geset. Echter als je getFruit () aanroept binnen de backquotes, gaat het mis. De if-statements worden netjes afgehandeld, alleen bonusFruit wordt niet geset.

Beschouw onderstaande dummy script:

Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

function getFruit () {
  if [[ $1 -eq 1 ]]; then echo "apple"; fi;
  if [[ $1 -eq 2 ]]; then echo "orange"; fi;
  bonusFruit="banana";
}

for i in 1 2; do
        out="$out `getFruit $i`";
done;

out="$out $bonusFruit";

echo $out;


Ik zou verwachten:
Bash:
1
2
$ ./example.sh
apple orange banana


Maar ik krijg:

Bash:
1
2
$ ./example.sh
apple orange


Ik heb de hele ochtend gezocht (google/tweakers), maar kan helaas niets kunnen vinden wat me dichter bij een antwoord brengt.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Gleighton
  • Registratie: November 2008
  • Niet online
Ik heb hiervoor onvoldoende bash ervaring, maar ik denk wel dat ik weet waar in het zit.

bonusFruit is in dit geval een locale variabele, die in dit geval alleen geldig en bekend is binnen getFruit(), want hier wordt deze geinitialiseerd en toegewezen. Buiten getFruit() weet niks van het bestaan van bonusFruit af.

Wat je dus moet proberen is bonusFruit te converteren naar een globale variabele. Zou het niet werken om voor getFruit() al bonusFruit = ""; te doen? Edit: Werkt niet.
in bash zijn alle variabelen globaal :)
Dat wist ik niet :+

[ Voor 16% gewijzigd door Gleighton op 19-07-2011 13:00 ]


Acties:
  • 0 Henk 'm!

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 12:19

Super_ik

haklust!

ik denk dat het fout gaat omdat wat tussen ` ` staat in een subshell word afgehandeld. de variabele wordt dus wel gezet, maar alleen in het child proces
Gleighton schreef op dinsdag 19 juli 2011 @ 12:53:
Ik heb hiervoor onvoldoende bash ervaring, maar ik denk wel dat ik weet waar in het zit.

bonusFruit is in dit geval een locale variabele, die in dit geval alleen geldig en bekend is binnen getFruit(), want hier wordt deze geinitialiseerd en toegewezen. Buiten getFruit() weet niks van het bestaan van bonusFruit af.

Wat je dus moet proberen is bonusFruit te converteren naar een globale variabele. Zou het niet werken om voor getFruit() al bonusFruit = ""; te doen?
in bash zijn alle variabelen globaal :)

[ Voor 67% gewijzigd door Super_ik op 19-07-2011 12:55 ]

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Nu online

Kees

Serveradmin / BOFH / DoC
Als je iets in backquotes zet, dan wordt de functie in een aparte child uitgevoert, en na het uitvoeren van die child zijn alle variablen erin weg. Ik vraag mij af waarom je het zo moeilijk doet, je gebruikt echo en variablen setten door elkaar, als je 1 van de twee had gebruikt dan was het gewoon goed gegaan, maar nu je aan het mixen bent gaat het fout, en dat is logisch.

Dus kies het een
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getFruit () {
  if [[ $1 -eq 1 ]]; then fruit="apple"; fi;
  if [[ $1 -eq 2 ]]; then fruit="orange"; fi;
  bonusFruit="banana";
}

for i in 1 2; do
  getFruit $i
  out="$out $fruit"
done;
     
out="$out $bonusFruit";
              
echo $out;


of het andere
code:
1
2
3
4
5
6
7
8
9
10
11
function getFruit () {
  if [[ $1 -eq 1 ]]; then echo -n "apple";
  elif [[ $1 -eq 2 ]]; then echo -n "orange";
  elif [[ $i -eq b ]]; then echo -n "banana"; fi;
}

for i in 1 2 b; do
  out="$out `getFruit $i`"
done;

echo $out;

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • spil
  • Registratie: September 2000
  • Laatst online: 06-09 18:54
Deze manier is ook erg traag, je kunt beter eval gebruiken en de variable meegeven aan je functie. Heb hier het voorbeeld niet bij de hand maar dan krijg je zoiets

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function getFruit () {
  if [[ $1 -eq 1 ]]; then eval $2="apple"; fi;
  if [[ $1 -eq 2 ]]; then eval $2="orange"; fi;
  if [[ $1 -eq 3 ]]; then eval $2="banana"; fi;
}

for i in 1 2; do
        getFruit $i fruit
        out="$out $fruit";
done;

getFruit 3 bonusFruit
out="$out $bonusFruit";

echo $out;

Homeserver specs: Dell Latitude D400 / 1GB mem / 160GB Seagate 5400.3 2.5" / 3Com 3c575 Cardbus NIC / Atheros AR5413 hostapd WLAN / FreeBSD 7.2

Pagina: 1