ubuntuusers.de

bash: Werte werden Array nicht hinzugefügt

Status: Gelöst | Ubuntu-Version: Lubuntu 18.04 (Bionic Beaver)
Antworten |

geimist

Anmeldungsdatum:
24. April 2015

Beiträge: Zähle...

Hallo zusammen,

ich kann mir nicht erklären, warum mein bestehendes Array nicht um zusätzliche Werte aus der Schleife ergänzt wird? Seht ihr den Fehler?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
imagelist=( "jbarlow83/ocrmypdf:latest" "jbarlow83/ocrmypdf-polyglot:latest" )

docker images | grep ocrmypdf | grep -v "<none>" | sort 2>&1 | while read line
    do
        localimage="$(echo ${line} | awk '{print $1}'):$(echo ${line} | awk '{print $2}')"
        echo "$localimage"
        imagelist+=( "$localimage" )
    done
    
echo "Arrayinhalt:"
echo ${imagelist[@]}

Das Script bei der Ausführung:

1
2
3
4
5
6
7
8
root@DS:~# /volume3/DEV/tmp.sh
jbarlow83/ocrmypdf-alpine:v9.0.3
jbarlow83/ocrmypdf:latest
jbarlow83/ocrmypdf:v9.0.5
jbarlow83/ocrmypdf:v9.5.0
Arrayinhalt:
jbarlow83/ocrmypdf:latest jbarlow83/ocrmypdf-polyglot:latest
root@DS:~# 

Vielen Dank schon mal im Voraus fürs Lesen und Gedanken machen 😊

Bearbeitet von rklm:

Syntaxhighlighting

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11261

Wohnort: München

Wenn du Pipes einsetzt, führt das dazu, dass Dinge rechts der Pipe in einer Subshell ausgeführt werden (Lesematerial: https://www.tldp.org/LDP/abs/html/subshells.html) und sobald eine Subshell die Befehle abgearbeitet hat, verschwinden die darin gehaltenen Variablen ins Nirvana. Die Elternshell bekommt also von Änderungen an diesen Variablen nichts mit.

Eine Möglichkeit das zu umgehen wäre den Datenfluss mit Hile einer Process Substitution so zu gestalten, dass die for-Schleife nicht in einer Subshell ausgeführt wird:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
imagelist=( "jbarlow83/ocrmypdf:latest" "jbarlow83/ocrmypdf-polyglot:latest" )

while read line
do
    localimage="$(echo ${line} | awk '{print $1}'):$(echo ${line} | awk '{print $2}')"
    echo "$localimage"
    imagelist+=( "$localimage" )
done < <(docker images | grep ocrmypdf | grep -v "<none>" | sort 2>&1)
    
echo "Arrayinhalt:"
echo ${imagelist[@]}

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

Vielleicht kann man die Generierung der Liste auch noch etwas optimieren:

1
2
3
4
5
6
imagelist=( 'jbarlow83/ocrmypdf:latest' 'jbarlow83/ocrmypdf-polyglot:latest' )

imagelist+=($(docker images | sort | awk '/ocrmypdf/ && !/<none>/ {print $1 ":" $2}'))

echo "Arrayinhalt:"
echo ${imagelist[@]}

Oder gleich

1
2
3
4
imagelist=( 'jbarlow83/ocrmypdf:latest' 'jbarlow83/ocrmypdf-polyglot:latest' $(docker images | sort | awk '/ocrmypdf/ && !/<none>/ {print $1 ":" $2}'))

echo "Arrayinhalt:"
echo ${imagelist[@]}

Ich halte die Ausgabeumleitung von Stderr vom sort für falsch.

geimist

(Themenstarter)

Anmeldungsdatum:
24. April 2015

Beiträge: 7

Vielen Dank euch beiden 😀 Ich habe mich jetzt für die 2. Variante von rklm entschieden. Die Version von seahawk1986 kam auf dem NAS (wo das Skript auch laufen soll) mit der Übergabe zur Schleife nicht zurecht.

Vielen Dank nochmal für eure Mühe.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

geimist schrieb:

Vielen Dank nochmal für eure Mühe.

Bitte! Dann bitte das Thema auf "gelöst" setzen.

Antworten |