Bash-Programmierung

Post Reply
Message
Author
ironice

Bash-Programmierung

#1 Post by ironice »

Guten Abend,
ich habe folgendes gedankliches Problem.
Wie bekannt sein dürfte is ja $1 bei Bash-Skripts der Name des ersten übergebenen Arguments.
Jedoch wird genau dieses $1 bei einem Aufruf in einer Funktion innerhalb des Skripts (einlesen eines Wertes auf $1 in der Fkt. // Aufruf der Funktion mit Paramter VAR1) komischerweise nicht überschrieben sondern bleibt in ihrer ursprünglichen Form erhalten.

Wieso dieses Verhalten ? Wird innerhalb des Funktionsaufrufes eine eigene Variable $1 erstellt oder wird die ursprüngliche $1 im Stack gespeichert und nach der Funktion zurückgeschrieben ? *verwirrt bin*

Würde mich über Erklärungen (auch Erklärungsversuche) freuen..

mfg
ironice

-------------------------------------
kurzes Bsp.-Skript (mit Parameter aufrufen) :

#!/bin/bash
get()
{
echo "Wert für $1 angeben : "
read $1
}

get VAR1
echo $VAR1
echo $1

Jochen

Re: Bash-Programmierung

#2 Post by Jochen »

> Wird innerhalb des Funktionsaufrufes eine eigene Variable $1 erstellt oder wird die ursprüngliche $1 im Stack gespeichert und nach der Funktion zurückgeschrieben ?

Nun frag mich nicht, ob das über'n Stack oder Namespaces gelöst wird, aber so ist es: Funktionen bekommen ihre Argumente über $1, $2, ... mitgegeben, welche dann Funktions-lokal sind. Das funktionierte sogar schon in der alten Bourne-Shell. Weitere Funktions-lokale Variablen kannst Du in der bash mittels "local" oder "typeset" definieren (was die alte sh aber schon nicht mehr konnte, weswegen Shellfunktionen dort wegen Nebeneffektgefahr fast unbrauchbar waren). Die Argumente des Skriptes werden dadurch nicht beeinflusst. In der bash-Manpage kannst Du nachlesen, welche Variablen alle lokal gehalten werden. Wenn ich mich recht erinnere, sind das aber nur $0 (Name der Funktion), $# (Anzahl Funktionsparameter) und $1 bis eval '${'$#'}'.

Jochen

Scory

Re: Bash-Programmierung

#3 Post by Scory »

>Wird innerhalb des Funktionsaufrufes eine eigene Variable $1

Der Kandidat hat 100 Punkte.

U. Maslo

Re: Bash-Programmierung

#4 Post by U. Maslo »

Wenn Du ähnliches wirklich benötigst, vielleicht etwa so:

<pre>
#!/bin/bash

get_var()
{
eval 'read -p "Gib was ein: " $1'
}

get_var VAR

echo "VAR: ${VAR}"

get_var2()
{
local VAR
read -p "Gib noch was ein: " VAR
echo "$VAR"
}

VAR2=$(get_var2)
echo "VAR2: ${VAR2}"
</pre>

Post Reply