Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
08.03.2021, 04:15:01

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
  • Mitglieder insgesamt: 25351
  • Letzte: Werner58
Statistiken
  • Beiträge insgesamt: 720552
  • Themen insgesamt: 58259
  • Heute online: 443
  • Am meisten online: 2287
  • (22.01.2020, 19:20:24)
Benutzer Online
Mitglieder: 2
Gäste: 343
Gesamt: 345

Autor Thema:  bash, Ersetzung von Eingabewert in Funktion  (Gelesen 210 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

bash, Ersetzung von Eingabewert in Funktion
« am: 21.02.2021, 23:55:31 »
Folgende Funktion gibt mir erfolgreich einen Wert des Arrays pro Zeile aus:
#!/bin/bash

# Array
my_array=( 0 1 2 3 7 7 6 7 8 9 )

# Funktion
fkt_echo_ein_array_element_pro_zeile() {
        for (( i=0; i<${#my_array[@]}; i++ ))
            do
                echo "$i: ${my_array[$i]}"
            done
    }

# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile my_array

Ausgabe:
0: 0
1: 1
2: 2
3: 3
4: 7
5: 7
6: 6
7: 7
8: 8
9: 9

Bei obiger funktionierender Variante, verwende ich die Bezeichnung "my_array" für das Array selber, in der Funktion als auch beim Aufruf der Funktion.

Nun möchte ich das universeller gestalten und so das nicht in der Funktion der selbe Arrayname verwendet werden muss, sondern das ich den verwendeten Arrayname an die Funktion übergebe. Das sollte nach meinem Verständnis in etwa so aus sehen, wobei ich bei folgenden die Fehlermeldung bekomme, das ich die Ersetzung noch nicht richtig mache.

#!/bin/bash

# Array
my_array=( 0 1 2 3 7 7 6 7 8 9 )

# Funktion
fkt_echo_ein_array_element_pro_zeile() {
        arrayname=$1 # Übergabe von Eingabewert an Funktion
        for (( i=0; i<${#"$arrayname"[@]}; i++ )) # vmtl. fehlerhafte Zeile
            do
                echo "$i: ${arrayname[$i]}"
            done
    }

# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile my_array

Ausgabe:
bash: i<${#"$arrayname"[@]}: Falsche Substitution
Wie macht man das richtig ?
« Letzte Änderung: 22.02.2021, 10:02:37 von Jan.Tenner »

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #1 am: 22.02.2021, 08:28:49 »
Jetzt habe ich es noch mal mit der folgenden Schreibweise versucht:

# Array
my_array=( 0 1 2 3 7 7 6 7 8 9 )
 
# Funktion
fkt_echo_ein_array_element_pro_zeile() {
    arrayname=$1
        for (( i=0; i<${#arrayname[@]}; i++ ))
            do
                echo "$i: ${arrayname[$i]}"
            done
    }
 
# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile my_array

Hier bekomme ich als Ausgabe:
0: my_array
Shellcheck bringt bei obigen folgende Meldung:
my_array=( 0 1 2 3 7 7 6 7 8 9 )
^-- SC2034: my_array appears unused. Verify use (or export if used externally).
« Letzte Änderung: 22.02.2021, 09:40:18 von Jan.Tenner »

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #2 am: 22.02.2021, 09:47:29 »
Der Funktionsaufruf übergibt j anur den Text "my_array"
Wenn Du das Array übergeben willst, dann so:
# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"

Über den Namen einer Variable kann man mit "${!var}" zugreifen. Array müsste auch gehen:

    arrayname=(${!1[@]})  #arrayname ist dann eine kopie von dem Array
« Letzte Änderung: 22.02.2021, 09:53:59 von MegaV0lt »

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #3 am: 22.02.2021, 10:09:51 »
Der Funktionsaufruf übergibt j anur den Text "my_array"
Wenn Du das Array übergeben willst, dann so:
Code: [Auswählen]
# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"
[/quote]

# Array
my_array=( 0 1 2 3 7 7 6 7 8 9 )

# Funktion
fkt_echo_ein_array_element_pro_zeile() {
    arrayname=$1
        for (( i=0; i<${#arrayname[@]}; i++ ))
            do
                echo "$i: ${arrayname[$i]}"
            done
    }

# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"
Wenn ich das so mache, bekomme ich nur noch folgende Ausgabe:
0: 0

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #4 am: 22.02.2021, 10:31:50 »
Wenn das Array übergeben wird, dann muss die Funktion angepasst werden:
# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"
[/quote]

# Array
my_array=( 0 1 2 3 7 7 6 7 8 9 )

# Funktion
fkt_echo_ein_array_element_pro_zeile() {
    # tmp_array=(${1[@]})  # Alternativ das Array kopieren und unten dann "${tmp_array[@]}" vwerwenden
        for i in "${1[@]}"
            do
                echo "$i: ${1[i]}"
            done
    }

# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #5 am: 22.02.2021, 10:35:48 »
Off-Topic:
Nun möchte ich das universeller gestalten und so das nicht in der Funktion der selbe Arrayname verwendet werden muss, sondern das ich den verwendeten Arrayname an die Funktion übergebe.
Der Weg ist das Ziel?

Ich dachte man programmiert um eine Eingabe automatisiert in eine Ausgabe zu verwandeln. Und zwar eine Ausgabe mit der man im weiteren etwas anfangen kann. Wie die Funktion oder das Array heißt, ist doch dabei völlig schnurz.

Wenn du aber dem Programm von außen mitteilen möchtest wie das Array gefälligst zu heißen hat, das Programm ein Array diesen Namens jedoch nicht kennt, wundert mich nicht, dass es eine unerwartete Ausgabe erzeugt.

jm2c

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #6 am: 22.02.2021, 11:04:27 »
Ich dachte man programmiert um eine Eingabe automatisiert in eine Ausgabe zu verwandeln. Und zwar eine Ausgabe mit der man im weiteren etwas anfangen kann. Wie die Funktion oder das Array heißt, ist doch dabei völlig schnurz.

Wenn du aber dem Programm von außen mitteilen möchtest wie das Array gefälligst zu heißen hat, das Programm ein Array diesen Namens jedoch nicht kennt, wundert mich nicht, dass es eine unerwartete Ausgabe erzeugt.
Ich habe außerhalb der Funktion ein Array, welches je nach Anwendung unterschiedliche Namen haben kann. Die Funktion soll, egal wie sich das Array im konkreten Fall nennt, den Inhalt des Arrays zeilenweise per Echo ausgeben. Es kann durchaus sein das man das mit mehr Erfahrung eleganter lösen kann, als in der Art und Weise in der ich das derzeit versuche zu tun.

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #7 am: 22.02.2021, 13:05:30 »
Wenn das Array übergeben wird, dann muss die Funktion angepasst werden:
# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"
[/quote]

# Array
my_array=( 0 1 2 3 7 7 6 7 8 9 )

# Funktion
fkt_echo_ein_array_element_pro_zeile() {
    # tmp_array=(${1[@]})  # Alternativ das Array kopieren und unten dann "${tmp_array[@]}" vwerwenden
        for i in "${1[@]}"
            do
                echo "$i: ${1[i]}"
            done
    }

# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"
In der Variante bekomme ich folgende Ausgabe:
bash: ${1[@]}: Falsche Substitution.

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #8 am: 22.02.2021, 13:24:46 »
Wenn du zwei verschiedene Arbeitsweisen im Skript implementieren möchtest, dann lege doch „Schalter“ an. Wenn bspw. der Parameter „-p“ übergeben wurde, dann arbeite so, wenn aber „-b“ übergeben wird, dann eben anders. Wahlweise auch in langer Schreibweise „--genauso“ bzw. „--ebenanders“.

Auf die Idee, dem Anwender es aufzubürden, das Skript von außen neu zu skripten, weil er die Arraynamen richtig eintippen muss, käme ich erst nicht.

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #9 am: 22.02.2021, 13:34:20 »
Wenn du zwei verschiedene Arbeitsweisen im Skript implementieren möchtest, dann lege doch „Schalter“ an. Wenn bspw. der Parameter „-p“ übergeben wurde, dann arbeite so, wenn aber „-b“ übergeben wird, dann eben anders. Wahlweise auch in langer Schreibweise „--genauso“ bzw. „--ebenanders“.

Auf die Idee, dem Anwender es aufzubürden, das Skript von außen neu zu skripten, weil er die Arraynamen richtig eintippen muss, käme ich erst nicht.

Ich habe keine Ahnung was du ausdrücken willst. Das was das Script machen soll, ist ein Array zeilenweise aus zu geben, nur man das mit Arrays machen kann die sich nicht alle gleich Namen haben müssen.

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #10 am: 22.02.2021, 13:49:00 »
Das müsste jetzt klappen:
# Array
my_array=( 0 1 2 3 7 7 6 7 8 9 )

# Funktion
fkt_echo_ein_array_element_pro_zeile() {
    local tmp_array=("$@")  # Kopie
        for i in "${!tmp_array[@]}"
            do
                echo "$i: ${tmp_array[i]}"
            done
    }

# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"

Re: bash, Ersetzung von Eingabewert in Funktion
« Antwort #11 am: 22.02.2021, 14:30:12 »
# Array
my_array=( 0 1 2 3 7 7 6 7 8 9 )

# Funktion
fkt_echo_ein_array_element_pro_zeile() {
    local tmp_array=("$@")  # Kopie
        for i in "${!tmp_array[@]}"
            do
                echo "$i: ${tmp_array[i]}"
            done
    }

# Funktionsaufruf
fkt_echo_ein_array_element_pro_zeile "${my_array[@]}"
Du bist genial. So kann man ein sich beliebig nennendes Array durch die Funktion abarbeiten lassen. Danke.