Problem mit Variabler

  • Hi,


    Hätte ne Frage wie folgt;


    in der Konsole;

    Code
    1. c=1
    2. var=text
    3. mappe_1=$var
    4. echo $mappe1


    Code
    1. echo $mappe_1
    2. text


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

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

    ist sowas überhaupt machbar ?



    Gruss

    Bert

    Hardware:PIntel Core Duo 2,93 Ghz, AsusP5QL PRO, Gigabyte GeForce GT730 (vdpau), Budget TT-S2 1600, 4Gb Ram Dual Channel, 2x Sata Hd
    Multibootsystem
    yavdr-0.6 mit VDR 2.2.0, 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

    Shell-Script
    1. #!/bin/bash
    2. declare -a mappe
    3. mappe+=("text")
    4. mappe+=("foobar")
    5. echo "${mappe[0]}"
    6. for idx in "${!mappe[@]}"
    7. do
    8. echo $idx "${mappe[$idx]}"
    9. 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
    1. bash /usr/script/_testing.sh
    2. please select the size in KiB for size_1 ?5555555
    3. please answer with numbers from 0 to 9.
    4. 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:PIntel Core Duo 2,93 Ghz, AsusP5QL PRO, Gigabyte GeForce GT730 (vdpau), Budget TT-S2 1600, 4Gb Ram Dual Channel, 2x Sata Hd
    Multibootsystem
    yavdr-0.6 mit VDR 2.2.0, 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:PIntel Core Duo 2,93 Ghz, AsusP5QL PRO, Gigabyte GeForce GT730 (vdpau), Budget TT-S2 1600, 4Gb Ram Dual Channel, 2x Sata Hd
    Multibootsystem
    yavdr-0.6 mit VDR 2.2.0, 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
    1. read -n 7 -p "please enter the size in KiB for size[$i]: " value

    dann dachte ich, ok ich mach mal:

    Code
    1. size_${z}=$value

    doch das klappt ja nicht.


    Dank FireFly weiss ich nun das sowas stattdessen klappt:

    Code
    1. 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
    1. size=5555555
    2. z=3
    3. $size${z}=$size
    4. -bash: 55555553=5555555: command not found

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

    Code
    1. size=5555555
    2. size_3=$size
    3. echo $size_3
    4. 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
    1. if [ "$z" = "1" ] ; then
    2. size_1=$size
    3. elif [ "$z" = "2" ] ; then
    4. size_2=$size
    5. 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:PIntel Core Duo 2,93 Ghz, AsusP5QL PRO, Gigabyte GeForce GT730 (vdpau), Budget TT-S2 1600, 4Gb Ram Dual Channel, 2x Sata Hd
    Multibootsystem
    yavdr-0.6 mit VDR 2.2.0, Ausgabe über Nvidia vdpau

    The post was edited 7 times, last by 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
    1. export size_${z}=$size

    nicht zum Ziel führen?


    rfu

    :vdr2 Server: vdr 2.4.7 (yavdr) im Ubuntu 20.04 docker, Client: vdr 2.4.7 auf RPi (MLD 5.5)

  • 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
    1. echo ${size[$z]}

    nehmen?


    rfu

    :vdr2 Server: vdr 2.4.7 (yavdr) im Ubuntu 20.04 docker, Client: vdr 2.4.7 auf RPi (MLD 5.5)

  • 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
    1. "${size[$z]}"

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

    Code
    1. for element in "${size[@]}"
    2. do
    3. echo "$element"
    4. done

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

    Code
    1. for idx in "${!size[@]}"
    2. do
    3. echo "$idx" "${size[$idx]}"
    4. 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
    1. gentoo64 ~/bin # ./_testing.sh
    2. please select the size in KiB for size_1 ? 123
    3. please select the size in KiB for size_2 ? 456
    4. please select the size in KiB for size_3 ? 789
    5. please select the size in KiB for size_4 ? 100
    6. size_1 = 123
    7. size_2 = 456
    8. size_3 = 789
    9. size_4 = 100

    LG Helmut

  • 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:PIntel Core Duo 2,93 Ghz, AsusP5QL PRO, Gigabyte GeForce GT730 (vdpau), Budget TT-S2 1600, 4Gb Ram Dual Channel, 2x Sata Hd
    Multibootsystem
    yavdr-0.6 mit VDR 2.2.0, Ausgabe über Nvidia vdpau

    The post was edited 2 times, last by Bert ().