Erweitern Sie die Tests
Im Wesentlichen ist die Shell eine Art Makrosprache oder zumindest eine hybride oder irgendeine Art von Sprache. Jede Befehlszeile kann grundsätzlich in zwei Teile unterteilt werden: den Parsing- / Eingabeteil und den Expansions- / Ausgabeteil.
Der erste Teil ist das, worauf sich die meisten Leute konzentrieren, weil es am einfachsten ist: Sie sehen, was Sie bekommen. Der zweite Teil ist das, was viele vermeiden, überhaupt zu versuchen, sehr gut zu verstehen, und ist der Grund, warum Leute sagen, dass Dinge eval
böse sind und immer Ihre Erweiterungen zitieren - die Leute wollen, dass das Ergebnis des ersten Teils gleich dem ersten ist. Das ist in Ordnung - aber es führt zu unnötig langen Code-Verzweigungen und einer Menge unnötiger Tests.
Erweiterungen sind Selbsttests . Die ${param[[:]#%+-=?]word}
Formulare sind mehr als genug, um den Inhalt eines Parameters zu validieren, sind verschachtelbar und basieren auf der Auswertung für NUL - was die meisten Leute sowieso von Tests erwarten. +
kann in Schleifen besonders praktisch sein:
r()while IFS= read -r r&&"${r:+set}" -- "$@" "${r:=$*}";do :;done 2>&-
IFS=x
printf %s\\n some lines\ of input here '' some more|{ r;echo "$r"; }
somexlines ofxinputxhere
... während read
nicht leere Zeilen "${r:+set}"
eingezogen werden, werden "set"
die Positionsangaben $r
angehängt. Aber wenn eine leere Zeile ist read
, $r
ist sie leer und "${r:+set}"
erweitert sich zu ""
- was ein ungültiger Befehl ist. Da die Befehlszeile jedoch erweitert wird, bevor der ""
Nullbefehl durchsucht wird, werden auch "${r:=$*}"
die Werte aller im ersten Byte verketteten Positionsangaben übernommen $IFS
. r()
könnte im |{
zusammengesetzten Befehl ;}
mit einem anderen Wert erneut aufgerufen werden $IFS
, um auch den nächsten Eingabeabsatz abzurufen , da read
das \n
Puffern einer Shell über die nächste ewline in der Eingabe hinaus unzulässig ist.
sh
und welche Shell erlaubt diesefor
Syntax? es ist ausdrücklich erlaubt inzsh
.