Problem mit Variabler

  • Hi,


    Hätte ne Frage wie folgt;


    in der Konsole;

    Code
    c=1
    var=text
    mappe_1=$var
    echo $mappe1


    Code
    echo $mappe_1
    text


    bis hierher alles klar, doch warum geht das folgende nicht;

    Code
    mappe_$c=$var
    -bash: mappe_1=text: command not found

    ist sowas überhaupt machbar ?



    Gruss

    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Dafür gibt es Arrays (deren Index fängt aber wie bei von C inspirierten Sprachen üblich bei 0 an): https://www.gnu.org/software/b…ual/html_node/Arrays.html

    Bash
    #!/bin/bash
    declare -a mappe
    mappe+=("text")
    mappe+=("foobar")
    echo "${mappe[0]}"
    
    for idx in "${!mappe[@]}"
    do
      echo $idx "${mappe[$idx]}"
    done

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi seahawk1986,


    Danke.


    Dann mach ich aber irgendwas anderes falsch denn ich habs auch mit nem array probiert, mein Beispiel in Post 1 war auch nicht grade optimal gewählt.

    Also ich hatte mit array das probiert;



    Ich will halt am Ende da in dem Fall parts=4 vier Variablen haben in etwa so;


    size_1=5555555

    size_2=4444444

    size_3=3333333

    size_4=2222222


    so als ob diese Variablen fix im Script eingetragen wurden also das dann z.b: ein echo $size_1 als Ergebnis 5555555 ausgibt.

    Das gelingt mir nicht (read akzeptiert da einfach kein Dollarzeichen also ne bereits gefüllte Variable), ich könnte da ja auch REPLY nehmen stattdessen

    aber das hab ich alles schon probiert und hat mich auch nicht weitergebracht (hab wohl irgendwo nen Denkfehler).


    Klar es gibt auch andere Lösungen ich will das aber so kurz wie möglich halten, das Script oben gibt dann das aus:

    Code
    bash /usr/script/_testing.sh
    please select the size in KiB for size_1 ?5555555
    
    please answer with numbers from 0 to 9.
    
    please select the size in KiB for size_1 ?


    das geht leider völlig daneben wie man sieht.

    Das mit dem bei 0 anfangen beim array dagegen kann man eh was tun, aber das ist erstmal nur sekundär für mich.


    Ich hatte es auch schon soweit das size_1 size_2 usw.. korrekt abgefragt wurden aber die Variablen waren danach dennoch falsch gefüllt.



    Gruss

    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • mappe_$c=$var
    -bash: mappe_1=text: command not found

    Evtl. geht das mit Referenzen declare -n variable das macht IMHO das ganze aber unnötig kompliziert


    Ich würde das auch mit einem Array machen, dabei ist parts auch variabel:

  • Hi FireFly,


    Danke, werd das gleich testen.


    Gruss

    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Hi Jungs,


    Das sind alles schöne Ansätze, aber ich steh dennoch immer wieder vor dem selben Problem.

    Ich versuch das jetzt mal besser bzw. genauer zu erklären was ich eigentlich will, es ist wie folgt;


    Ich möchte in ner Schleife interaktiv die size abfragen wobei die size is nix anderes als ne Grösse die man eingibt in Form von Zahlen

    und zwar soll das die Grösse in KiB darstellen.

    wie oft die size abgfragt wird das wiederum hängt von der Variablen parts ab, also z.b: wenn

    parts=4

    dann wird die size 4x abgefragt, bis hierher keinerlei Problem

    doch möchte ich mittels nem Zähler der mit (z=1) anfängt pro Schleifendurchlauf an die variable size ne Nummer anhängen.


    also wenn nun size gefüllt ist mit z.b: 5555555 so das echo "$size" eben 5555555 ausgibt möchte ich diese Variable (jetzt mal grob gesagt)

    quasi umbenennen so das size nachher size_1 ist und echo $size_1 die 5555555 ausgibt.

    Beim nächsten Schleifendurchlauf wird dann der Zähler erhöht mit z=$((z+1)) und dann sollte aus size mit was immer diese Variable nun gefüllt wurde

    size_2 werden usw...


    Hab da ziemlich einfach gedacht und dachte das kann doch in der bash nie ein Problem sein und es würde das folgende genügen,

    also wenn da nun wie von FireFly statt der REPLY variablen value verwendet wird:

    Code
    read -n 7 -p "please enter the size in KiB for size[$i]: "  value

    dann dachte ich, ok ich mach mal:

    Code
    size_${z}=$value

    doch das klappt ja nicht.


    Dank FireFly weiss ich nun das sowas stattdessen klappt:

    Code
    size[$z]=$value

    doch ist das ja dennoch keine Variable die ich so weiter verwenden kann, denn ein echo $size[$z] gibt ja jetzt lediglich den Zähler aus

    also die variable z und das in eckigen Klammern.


    Vereinfacht gezeigt sieht man das Problem wie folgt am Besten denke ich:


    klappt nicht:

    Code
    size=5555555
    z=3
    $size${z}=$size
    -bash: 55555553=5555555: command not found

    hingegen ohne variable für den Zähler (z) klappt das problemlos:

    Code
    size=5555555
    size_3=$size
    echo $size_3
    5555555


    Ich hab ne Lösung aber die benötigt keinerlei array, und braucht aber zwei while Schleifen sowie ein case und innerhalb vom case ein paar if elif Abfragen also so:

    Code
    if [ "$z" = "1" ] ; then
        size_1=$size
    elif [ "$z" = "2" ] ; then
        size_2=$size
    usw...


    Das klappt dann natürlich, allerdings hatte ich gehofft das kürzer hinzubekommem, ich bin nicht sicher ob sowas mit nem array und ohne den ifs

    hinzubekommen ist, doch wenn das ginge würd ich gerne wissen wie ?



    Hier mal meine derzeitige Lösung:

    wobei die Variable parts und DEV usw.. frage ich eh auch bereits an anderer Stelle interaktiv ab (das hier ist halt nur der relevante Codeschnipsel

    und damit der funktioniert (falls den jemand testen will - Script tut eh nix wirkliches bzw. gefährliches) hab ich diese Variablen derweil so darin vorgegeben.


    und so sieht das bei der Ausführung aus:


    Gruss

    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

    7 Mal editiert, zuletzt von Bert ()

  • Hi,


    ich würde ja auch für die Arrays plädieren, aber wenn es denn unbedingt variablen der Art "size_1" sein müssen, sollte

    Code
    export size_${z}=$size

    nicht zum Ziel führen?


    rfu

    :vdr2 Server: vdr 2.6.4 (yavdr) im Ubuntu 22.04 docker, Client: Kodi (LibreELEC)

  • Ach ja, und was genau bei den Arrays nicht funktioniert bei Dir ist mir noch nicht so ganz klar...

    doch ist das ja dennoch keine Variable die ich so weiter verwenden kann, denn ein echo $size[$z] gibt ja jetzt lediglich den Zähler aus

    also die variable z und das in eckigen Klammern.

    Du wolltest eventuell

    Code
    echo ${size[$z]}

    nehmen?


    rfu

    :vdr2 Server: vdr 2.6.4 (yavdr) im Ubuntu 22.04 docker, Client: Kodi (LibreELEC)

  • doch ist das ja dennoch keine Variable die ich so weiter verwenden kann, denn ein echo $size[$z] gibt ja jetzt lediglich den Zähler aus

    Der Zugriff auf die Werte eines Arrays funktioniert anders - wenn du den Wert aus dem Array size am Index z haben willst:

    Code
    "${size[$z]}"

    Und wenn du eh nichts anderes machst als über die Elemente im Array zu laufen, dann reicht so eine for-Schleife:

    Code
    for element in "${size[@]}"
    do
        echo "$element"
    done

    Falls du einen laufenden Index benötigst, ist es üblich über die Indices zu laufen statt extern zu zählen:

    Code
    for idx in "${!size[@]}"
    do
        echo "$idx" "${size[$idx]}"
    done

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Bert : wenn es kein Array sein soll, kann man mit "eval" Variable auch dynamisch erzeugen.

    Hier dein vereinfachtes Script aus dem Post #3:

    Das Ergebnis:

    Code
    gentoo64 ~/bin # ./_testing.sh
    please select the size in KiB for size_1 ? 123
    please select the size in KiB for size_2 ? 456
    please select the size in KiB for size_3 ? 789
    please select the size in KiB for size_4 ? 100
    size_1 = 123
    size_2 = 456
    size_3 = 789
    size_4 = 100

    LG Helmut

    HelmutB passed unfortunately away on July 21, 2022 ... RIP 🖤

  • Hi,


    Ihr seid super :)

    Das haut soweit alles hin nun, das von rfu mit dem export (an das hab ich nicht mal gedacht), sieht jetzt insgesamt wie folgend aus

    wobei ich das mit dem Code von FireFly getestet habe, also so:


    Auch das von HelmutB mit eval haut super hin, sieht so aus:


    Also alles super, nun muss ich noch gucken mit nem array wie von seahawk1986 vorgeschlagen, aber sind jetzt schon schöne kurze Lösungen.

    Hab ja schon öfters mal arrays in Scripts eingebaut aber noch nicht für so nen Fall (steh da immer noch am Schlauch) aber das wird schon noch.


    Vielen Dank an alle Beteiligten hier :] kann man nun eigentlich als gelöst betrachten den Thread.



    Gruss

    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

    2 Mal editiert, zuletzt von Bert ()

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!