ubuntuusers.de

Array fortlaufend mit Werten füllen bis zu einem Maximalwert

Status: Gelöst | Ubuntu-Version: Xubuntu 22.04 (Jammy Jellyfish)
Antworten |

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1145

Hallo,

ich möchte fortlaufend ein Array mit Werten füllen bis ein Maximalwert am befüllten Elementen erreicht ist, sagen wir mal 100. Der 101 Wert soll hinten an das Array angefügt werden, der erste Wert aber gelöscht werden. Alle Werte rücken eine Position nach vorn. Ich habe das hier versucht (ist nicht ganz was ich will, hier soll das erste Element im Array durch den neuen Wert ersetzt werden - nicht einmal das geht):

1
2
3
4
5
6
7
8
9
while true; do
 count=$(echo ${array[*]} | wc -w)
 if [ "$count" -lt 5 ]; then
  array+=('1')
 else
  array[0]=('0')
 fi
 echo ${array[*]}
done

Hier kommt

array[0]: Kann einem Feldelement keine Liste zuweisen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13168

Das kannst Du doch leicht berechnen. Da musst Du nichts schieben:

1
2
3
4
5
6
$ b=1000
$ a=$((1000 - 30))
$ array=(); i=$a; while [ $i -le $b ]; do array+=($i); i=$((i+1)); done
$ echo ${array[@]}
970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
$ 

Ggf. die Bedingung in Zeile 3 anpassen zu -lt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13168

Ganz dreckig geht es auch mit eval:

1
2
3
4
5
$ b=1000
$ a=$((1000 - 30))
$ eval "array=({$a..$b})"
$ echo ${array[@]}
970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6481

Wohnort: Hamburg

Wenn ich so etwas lese:

... der erste Wert aber gelöscht werden. Alle Werte rücken eine Position nach vorn.

fällt mir sofort das Stichwort Ringpuffer ein. In der digitalen Signalverarbeitung wird das sehr häufig verwendet.

So etwas mittels Shellscript zu realisieren, würde ich allerdings als Strafarbeit betrachten. Könnte aber auch daran liegen, dass ich um Shellscripte eher einen Bogen mache.

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 243

Wohnort: Aachen

Moin,

Fried-rich schrieb:

1
 count=$(echo ${array[*]} | wc -w) 

😮 für die Anzahl braucht man doch kein wc, einfach

1
count=${#array[*]}

Der 101 Wert soll hinten an das Array angefügt werden, der erste Wert aber gelöscht werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
if [ ${#array[@]} -ge 100 ];then
  # Array und neuen Wert als Parameter setzen
  set -- ${array[@]} "NeuerWert"

  # Parameter um eins vorrücken
  shift

  # Parameter als Array setzen
  array=($@)
else
  array+=("NeuerWert")
fi

Gruß Thomas

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1145

TK87 schrieb:

Moin,

Fried-rich schrieb:

1
 count=$(echo ${array[*]} | wc -w) 

😮 für die Anzahl braucht man doch kein wc, einfach

1
count=${#array[*]}

Das kannte ich noch nicht, danke für den Hinweis.

Antworten |