ubuntuusers.de

Bash: Liste in Variablen einlesen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

gehtmaguad

Anmeldungsdatum:
28. Juli 2008

Beiträge: 47

Hallo! Bin auf der Suche nach Hilfe für mein Script:

Ich habe in einer Variable templiste eine Liste an Temperaturwerten gespeichert (je nachdem wo ich die ssh-Abfrage durchführe schwankt die Anzahl)

Jetzt möchte ich in einer For-Schleife der Variable temp1 den ersten Wert der Liste zuweisen, der Variable temp2 den zweiten Wert, usw...

Soweit bin ich gekommen:

i=1
for tempwert in $templiste; do
tempvar$i=$tempwert
let "i += 1"
done

Ergebnis:

line 22: tempvar1=29: command not found
...
line 22: tempvar37=26: command not found

Somit erfolgt ja die Zuweisung richtig, jedoch inkl. eines Fehlers..

Kann mir da jemand weiterhelfen??

mfg

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

vielleicht funktioniert das so, wenn es mit for sein muß:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

i=0

for var in `exec 3< temperaturwerte_datei`

do

read var[$i] <&3

i=` expr $i + 1`

done

ungetestet

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

oder so:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash

i=0

exec 3< temperaturwerte_datei

for var in `cat temperaturwerte_datei`

do

read var[$i] <&3

i=` expr $i + 1`

done

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

du könntest aber ein Array benutzen. Bsp:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

var0=`cat temp`

var00=($var0)

for var in "$var00"

do

echo "${var00[2]}"

done

schusch

Avatar von schusch

Anmeldungsdatum:
2. September 2008

Beiträge: 324

Wohnort: Berlin

gehtmaguad schrieb:

Kann mir da jemand weiterhelfen??

Falls du unbedingt Variablennamen temp1, temp2 usw. haben willst, ginge das so:

i=1
for tempwert in $templiste; do
eval temp"$i"=$tempwert # epfehlenswerter temp[$i]=$tempwert
let "i += 1"
done

*edit* Kürzer:

1
set $templiste

Dann stehen die Temperaturwerte in $1, $2, $3 usw. und in $# steht die Anzahl der eingelesenen Werte.

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

so klappt es auch:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

i=0

exec 3< temp

for var in `cat temp`

do

read var${i} <&3

i=`expr $i + 1`

done

echo $var2

echo $var0

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

pinguino schrieb:

so klappt es auch:

1
2
for var in `cat temp`
i=`expr $i + 1`

a) Backticks sind deprecated, und sollten durch $() ersetzt werden.

Zum einen verwechselt man sie leicht mit Apostrophen, vor allem aber lassen sie sich nicht gut schachteln.

b) Die bash kann intern begrenzt selbst rechnen.

i=$((i+1)) 

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

ich benutze das, weil alle Shells das verstehen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

Und wer versteht

for var in $(cat temp)
# und
i=$((i+1)) 

nicht?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4668

Wohnort: Berlin

@pinguino: Aber Arrays benutzen. Als wenn das alle Shells verstehen würden. 😉

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

user unknown schrieb:

Und wer versteht

for var in $(cat temp)
# und
i=$((i+1)) 

nicht?

Ist die Krise schon bei IT eingetroffen. Warum werden die Befehle / Anweisungen immer kürzer? 😈 Für die OS sind die Befehle doch kein Problem. Außerdem sind die Preise der Festplatten billiger geworden.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

Die Kriese haben wir ja erst seit 2007 im Anzug, daß Backticks deprecated sind dagegen habe ich vor bestimmt 6 Jahren zum ersten Mal gelesen.

Kürzer ist $(foo) ja nicht als

`foo`

. Es ist lesbarer und man kann es leicht schachteln, waren die Argumente dafür, und expr ist ein externes Programm, welches man einspart. Natürlich ist beides kein Beinbruch, aber mir scheint es angeraten den Usern das leichtere beizubringen, damit sie, wenn es drauf ankommt, gleich das richtige benutzen.

gehtmaguad

(Themenstarter)

Anmeldungsdatum:
28. Juli 2008

Beiträge: 47

Danke an euch für die Antworten!

Ich kann nun die jeweiligen Temperaturwerte ansprechen; und bin mir sicher das ich den Syntax noch öfters brauchen kann ☺

mit freundlichen Grüßen

ein zufriedener Ubuntu-User der sich jetzt schon richtig auf den Koala freut 😉

gehtmaguad

(Themenstarter)

Anmeldungsdatum:
28. Juli 2008

Beiträge: 47

Hab jetzt noch mit der Ausgabe herum experimentiert, da vl. mal wer das gleiche Problem hat, mein Ansatz (funktioniert(getestet) aber wsl verbesserungswürdig):

# Werte Variablen zuweisen

i=1
for wert in $liste; do
eval var$i=$wert
let "i += 1"
done
# Ausgabe der Werte

k=1
while [ $k -le $i ]
do
printf "var$k=$[var$k]; ";
let "k += 1"
done
printf "\n";
Antworten |