Variable durch Schleife setzen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von -eraz-, 16.09.2009.

  1. #1 -eraz-, 16.09.2009
    Zuletzt bearbeitet: 16.09.2009
    -eraz-

    -eraz- Tripel-As

    Dabei seit:
    27.03.2008
    Beiträge:
    151
    Zustimmungen:
    0
    hi folks,

    möchte durch eine for Schleife mehrere Variablen setzten lassen. Doch mein erster Lösungsansatz scheint nicht zu funktionieren:

    Code:
    #!/bin/bash
    # Dateisysteme auslesen
    temp=$(df --type=ext3 |grep % |wc -l)
    let i=$temp-1
    
    echo "Es wurden $i Datentraeger gefunden!"
    
    # Auslastung der Datentraeger in Variable lesen
    for (( x=1; x<=$i; x=$x+1 )); do
            hdd$x=$(df --type=ext3 | grep % | tail -n3 |cut -d" " -f23 | head -n1 | cut -c1-2)
    done
    echo $hdd1
    echo $hdd2
    echo $hdd3
    
    Es kommt die Meldung:
    Code:
    -bash: hdd1=45: command not found
    -bash: hdd2=45: command not found
    -bash: hdd3=45: command not found
    Das $x in hdd$x scheint er nicht zu mögen. Wie bekommt man das hin?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 16.09.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    einmal das Forum mit Suchwort "eval" durchforsten.

    mfg,
    bytepool
     
  4. -eraz-

    -eraz- Tripel-As

    Dabei seit:
    27.03.2008
    Beiträge:
    151
    Zustimmungen:
    0
    Danke für den Tipp.
    Also ich muss ehrlich zugeben ich check überhaupt nicht was eval macht. Aber wenn ich es so einsetzte:

    Code:
    for (( x=1; x<=$i; x=$x+1 )); do
            eval hdd$x=$(df --type=ext3 | grep % | tail -n3 |cut -d" " -f23 | head -n1 | cut -c1-2)
    done
    Kommt zumindest kein Fehler mehr. Aber wenn ich mit echo $hdd$x den Wert ausgeben will kommt nur der Wert von $x. Hab zwar ähnliche Beispiele im Forum gefunden, aber ich kriegs damit nicht wirklich hin... :(
     
  5. Rvg

    Rvg Doppel-As

    Dabei seit:
    11.07.2004
    Beiträge:
    141
    Zustimmungen:
    0
    Code:
    #!/bin/bash
    
    # Dateisysteme auslesen
    i=$(df -t ext4 -t ext2 | grep \/dev\/ | wc -l)
    echo "Es wurden $i Datentraeger gefunden!"
    
    # Auslastung der Datentraeger in Variable lesen
    # x=2 weil sed mit 1 anfaengt zu zaehlen
    for (( x=2; x<=$i+1; x=$x+1 )); do
      # festplatten suchen, wie oben, dann zeile x ausgeben, und davon feld nummer 5 (die % usage)
      hdds[$x]=$(df -t ext4 -t ext2 | sed -n "${x}p" | awk '{ print $5; }' )
    done
    
    #beispielausgabe, wenn nur ausgabe, dann gleich in der for-schleife
    for hdd in ${hdds[@]}
    do
      echo $hdd
    done
    
    tut was es tun soll, denke ich, mein -f23 (cut) ist leer. wegen den ext4 nicht wundern, ich hab keine ext3-platte bei der hand
    und von eval hab ich keine ahnung :]
     
  6. NoXqs

    NoXqs Routinier

    Dabei seit:
    07.05.2007
    Beiträge:
    420
    Zustimmungen:
    0
    Ort:
    Bremen
    Kann es sein,dass da noch ein grundsätzlicher Denkfehler drin steckt?

    Du zählst deinen Index hoch ($x),
    aber führst immer den gleichen Befehl aus, um die Variable zu füllen.
    Also bekommst du immer den gleichen Wert in deine Variable, egal wieviele Zeilen du ausliest.
    Hier mal quick&dirty etwas code.
    Ist es das, was du willst??

    Code:
    #!/bin/sh
    
    
    typeset -i x=1
    
    for VAR in $(df --type=ext3 | grep -v Filesystem | awk '{ print $5 }')
    do
    hdd[x]=$VAR
    (( x = $x + 1 ))
    done
    
    echo "HDD-1 ist ${hdd[1]}"
    echo "HDD-2 ist ${hdd[2]}"
    echo "HDD-3 ist ${hdd[3]}"
    echo ${hdd[*]}
    
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. #6 bytepool, 16.09.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    eval wertet im Grunde die Zeile die du an eval uebergibst in der aktuellen Umgebung aus. D.h. du konstruierst dir erst die Zeile die du ausgefuehrt haben willst, und die wird dann ausgefuehrt. Z.B. aus hdd$x="foo" wird hdd1="foo". Ohne eval geht's nicht, weil du hdd$x keinen Wert zuweisen kannst, aber hdd1 schon.

    Logisch. $hdd ist leer da nicht zugewiesen, $x hat noch einen Wert, also wird x ausgegeben. Entweder musst du $hdd1 etc. schreiben, oder du musst auch das echo noch in ein eval einbetten, z.B.

    Code:
    eval echo echo \$hdd$x
    
    Ich meine da gibt es auch eine kuerzere Notation fuer, faellt mir aber grad nicht ein.

    @die Anderen
    Mit Arrays, wie langweilig, das ist ja zu einfach. ;)
    Warum einfach wenn's auch kompliziert geht?

    mfg,
    bytepool
     
  9. -eraz-

    -eraz- Tripel-As

    Dabei seit:
    27.03.2008
    Beiträge:
    151
    Zustimmungen:
    0
    Erstmal danke für die Hilfe :)

    @Noxqs
    Ja das stimmt, um die Sache habe ich mich erstmal nicht gekümmert. Aber mittlerweile funktioniert das ganze schon recht gut. Das Skript sieht nun so aus:
    Code:
    #!/bin/bash
    
    # Dateisysteme auslesen
    temp=$(df -h |grep % |wc -l)
    let i=$temp-1
    
    echo "Es wurden $i Datentraeger gefunden!"
    
    # Auslastung der Datentraeger in Variable lesen
    for (( x=1; x<=$i; x=$x+1 )); do
            eval hdd$x=$(df -h | grep % | tail -n$i |cut -b41-42 |sed -n ''$x'p' | sed -e '/ /s/ //g')
            wert=$(eval "echo \$hdd$x")
            echo $wert
                    if eval [ $wert -ge 40 ]; then
                            echo "Auslastung von hdd$x zu hoch!"
                    else
                            echo "hdd$x - Alles OK"
                    fi
    done
    
     
Thema:

Variable durch Schleife setzen

Die Seite wird geladen...

Variable durch Schleife setzen - Ähnliche Themen

  1. Textdatei zeilenweise in durchnummerierte Variablen schreiben

    Textdatei zeilenweise in durchnummerierte Variablen schreiben: Hi Leute, ich versuche folgendes Problem zu lösen. Ich möchte eine Textdatei einlesen und den Inhalt jeder Zeile in immer eine neue Variable...
  2. Textstring nach muster durchsuchen und in Variable speichern

    Textstring nach muster durchsuchen und in Variable speichern: Hallo, habe ein "kleines" Problem! ps -ef | grep mysql | grep GroupLabel | grep -v grep liefert: root 4298 1 0 Nov13 ? 00:00:00...
  3. Script Datumsproblem Variablen durcheinander??

    Script Datumsproblem Variablen durcheinander??: Hallo zusammen habe ein kleines Backupsript welches täglich nachts um 23.50 Uhr einge Dump erstellt und per sftp auf einen Sicherungsserver...
  4. Nach Muster in Datei suchen und durch Variable ersetzen

    Nach Muster in Datei suchen und durch Variable ersetzen: Hallo, ich bekomme es einfach nicht hin, ich will in meinem Script eine Datei durchsuchen nach ${xxxxx} und die dann durch eine Variable mit dem...
  5. sed - Teilstring durch Variable ersetzen

    sed - Teilstring durch Variable ersetzen: Hallo, ich schreibe gerade an einem Shell-Skript das mir eine Datei ausliest und dort einen Platzhalter durch das aktuelle Datum ersetzt....