Variable durch Schleife setzen

E

-eraz-

Tripel-As
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?
 
Zuletzt bearbeitet:
Hi,

einmal das Forum mit Suchwort "eval" durchforsten.

mfg,
bytepool
 
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... :(
 
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 :]
 
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[*]}
 
Hi,

Also ich muss ehrlich zugeben ich check überhaupt nicht was eval macht.
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.

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... :(

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
 
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
 

Ähnliche Themen

HandbrakeCLI Shell Skript

OpenJDK8 unter Debian7.11/sparc64/kernel 3.16 kompilieren

Shellskript - Fehler in Cron

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Zurück
Oben