${var#pattern}
ist ein parameter expansion, die von der Vorderseite der Saite entfernt für pattern
auf den Wert des $var
mit dem kürzestmöglichen Spiel erweitert.
So entfernt ${VAR#*:}
alles bis einschließlich der ersten :
; ${VAR#*:*:}
entfernt alles bis einschließlich der zweiten :
.
die Hinter *
s am Ende der in der Frage gegeben Erweiterungen haben keine Verwendung, und soll vermieden werden: Es gibt keinen Grund, ${var#*:*:*}
statt ${var#*:*:}
zu verwenden - da diese die kleinste Menge an Text passen möglich, und *
ist erlaubt, auf 0 Zeichen zu erweitern, die endgültige *
entspricht und entfernt nichts.
Wenn das, was Sie wirklich wollen, ist ein Array ist, können Sie stattdessen ein echtes Array betrachten verwenden.
# read contents of string VAR into an array of states
IFS=: read -r -a states <<<"$VAR"
echo "${states[0]}" # will echo NJ
echo "${states[1]}" # will echo NY
echo "${#states[@]}" # count states; will emit 3
... was gibt Ihnen auch die Möglichkeit, zu schreiben:
printf ' - %s\n' "${states[@]}" # put *all* state names into an argument list
Nein, es ist nicht. Ihr Code enthält keine Arrays. – melpomene
ok. Also wird VAR als String behandelt und echo druckt einfach einen Teilstring, indem Doppelpunkt (:) als Trennzeichen behandelt wird. – oradbanj
Lesen Sie das Feinhandbuch: https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter -Expansion – melpomene