bash array unset geht nur einmal ?...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ren22

bash array unset geht nur einmal ?...

Beitrag von ren22 » 03.09.2014 18:26:30

hallo ich versuche gerade ein script zu schreiben was alle .dep dateien in ein array 'cat' -ted und wenn das jeweilige array element am ende der schleife ist, soll dieses array element mit 'unset' gelöscht werden was aber nur bei "lcd4linux" klappt .. den rest löscht das script nicht .. kann mir wer sagen wo der Fehler liegt?

Code: Alles auswählen

#!/bin/bash

EXTENSIONS=(lcd4linux libpng libgd libusb-compat)
EXTENSIONFILESSOURCE=/mnt/sda1/tce/optional

#
#get the size of the extensions
#
set -x

function1 () {
for i in ${EXTENSIONS[@]}; do

    if [ -f $EXTENSIONFILESSOURCE/$i.tcz.dep ];then #if .dep file exists write it into an array

<------>echo "dep"
    fi

       
       unset EXTENSIONS[$i] #remove current array-element from array


echo "-------------"
echo ${EXTENSIONS[@]}
echo ${#EXTENSIONS[@]}
sleep 1
done

}

while [ $(echo ${#EXTENSIONS[@]}) -gt 0 ] ; do
function1
done

echo "-------------"
echo ${EXTENSIONS[@]}
echo ${#EXTENSIONS[@]}
ausgabe:

Code: Alles auswählen

./depfinder.sh 
dep
-------------
libpng libgd libusb-compat
3
-------------
libpng libgd libusb-compat
3
-------------
libpng libgd libusb-compat
3
dep
-------------
libpng libgd libusb-compat
3 ...CTRL+C
wie man sieht "lcd4linux" wird gelöscht aber der rest wird nicht gelöscht und bleibt in einer endlos schleife hängen
vielen Dank

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: bash array unset geht nur einmal ?...

Beitrag von smutbert » 03.09.2014 20:51:36

i nimmt bei dir die einzelnen Werte des arrays an, zum Löschen würdest du aber imho den Index benötigen.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: bash array unset geht nur einmal ?...

Beitrag von gms » 03.09.2014 21:53:35

Vorsicht auch beim Löschen über den Index, denn dabei entstehen Lücken im Index

Code: Alles auswählen

gms@sirius:~$ EXTENSIONS=(lcd4linux libpng libgd libusb-compat)
gms@sirius:~$ set | grep EXTENSIONS
EXTENSIONS=([0]="lcd4linux" [1]="libpng" [2]="libgd" [3]="libusb-compat")
gms@sirius:~$ unset EXTENSIONS[2]
gms@sirius:~$ set | grep EXTENSIONS
EXTENSIONS=([0]="lcd4linux" [1]="libpng" [3]="libusb-compat")
gms@sirius:~$ echo ${#EXTENSIONS[@]}
3

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash array unset geht nur einmal ?...

Beitrag von Cae » 04.09.2014 03:00:42

ren22 hat geschrieben:

Code: Alles auswählen

while [ $(echo ${#EXTENSIONS[@]}) -gt 0 ] ; do
Meinten Sie folgendes?

Code: Alles auswählen

while [ ${#EXTENSIONS[@]} -gt 0 ] ; do
echo und Subshell erzeugt an der Stelle genau denselben Output, ist aber deutlich verschwurbelter (und hat mehr Overhead, ist also langsamer).

Generell ist noch zu sagen, dass du sprechende Namen verwenden solltest, bei function1() weiss niemand, was gemeint ist, unset_if_subdepends() oder aehnlich ist erheblich aussagekraeftiger (zumindest scheint der Code mal etwas in dieser Richtung zu tun zu sollen).

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: bash array unset geht nur einmal ?...

Beitrag von rendegast » 04.09.2014 07:30:33

indexed array <-> assoziativer array

Code: Alles auswählen

#!/bin/bash


#declare -a EXTENSIONS  # indexed array
    #EXTENSIONS=(lcd4linux libpng libgd libusb-compat)          # ein indexed array

declare -A EXTENSIONS   # assoziativer array
    EXTENSIONS[lcd4linux]=lcd4linux
    EXTENSIONS[libpng]=libpng
    EXTENSIONS[libgd]=libgd
    EXTENSIONS[libusb-compat]=libusb-compat

echo  EXTENSIONS@ ${EXTENSIONS[@]}

for i in lcd4linux libpng libgd libusb-compat; do

echo ii $i
echo  AAA EXTENSIONS[$i]
echo  AAA ${EXTENSIONS[$i]}

echo  AA0 ${EXTENSIONS[0]} AA1 ${EXTENSIONS[1]} AA2 ${EXTENSIONS[2]} AA3 ${EXTENSIONS[3]} AA4 ${EXTENSIONS[4]}
echo  AAlcd4linux ${EXTENSIONS[lcd4linux]} AAlibpng ${EXTENSIONS[libpng]} AAlibgd ${EXTENSIONS[libgd]} AAlibusb-compat ${EXTENSIONS[libusb-compat]

done
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten