Beitrag
von Lohengrin » 20.11.2018 01:55:28
Mit unset foo wird, wenn foo ein Array ist, das Array entfernt. Aber [[ -v foo ]] bezieht sich auf foo[0]. Das passt mMn nicht zusammen.
Wenn foo ein Array ist, dann wird mit foo= das foo[0] auf null gesetzt, und wenn foo kein Array ist, dann wird mit foo= das ganze foo auf null gesetzt. Um sicher zu sein, dass das ganze foo auf null ist, muss man unset foo ; foo= machen.
[[ ${#foo[*]} == 0 ]] sagt mir, dass foo ein leeres Array ist, foo leer ist, oder foo unset ist. Aber declare -p foo hat Rückgabewert 0, wenn foo ein leeres Array ist. Leider kann man mit declare foo auch foo deklarieren, ohne es zu setzen.
Damit habe ich schon fast einen Test auf leeres Array gefunden, nämlich declare -p foo &>/dev/null && [ ${#foo[0]} == 0 ]. Aber eben nur fast, weil das noch ein deklariertes und ungesetztes foo mitnimmt.
Die Frage bleibt. Wie testet man auf leeres Array?
Es ist ja nicht nur so, dass bei einem Array ${foo} das ${foo[0]} ist. Auch umgekehrt ist bei einem Nichtarray ${foo[0]} das ${foo}. Aber bei ${foo[-1]} dann doch nicht, gibt Fehlermeldung.
Gibt es einen guten Grund für dieses Verhalten? Ich sehe keinen, bin dafür, dass das abgeschafft wird.
Harry, hol schon mal das Rasiermesser!