2017-06-02 6 views
0

Ich verwende Bourne Shell. Müssen Sie bestätigen, ob mein Verständnis von Folgen korrekt ist?

$ echo $SHELL 
/bin/bash 

$ VAR="NJ:NY:PA" <-- declare an array with semicolon as separator? 

$ echo ${VAR#*} <-- show entire array without separator? 
NJ:NY:PA 

$ echo ${VAR#*:*} <-- show array after first separator? 
NY:PA 

$ echo ${VAR#*:*:*} <-- show string after two separator 
PA 
+1

Nein, es ist nicht. Ihr Code enthält keine Arrays. – melpomene

+0

ok. Also wird VAR als String behandelt und echo druckt einfach einen Teilstring, indem Doppelpunkt (:) als Trennzeichen behandelt wird. – oradbanj

+0

Lesen Sie das Feinhandbuch: https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter -Expansion – melpomene

Antwort

2

${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 
Verwandte Themen