Was bedeutet in diesem Zusammenhang $ {1: 0: 2}?

19

Ich schaue in den unten angezeigten Code und prüfe die Eingabe, ob die Zeilen- / Spaltenargumente entweder mit -roder beginnen -c. Was ${1:0:2}heißt in diesem Zusammenhang?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi
user165213
quelle
7
Sie sollten die von Ihnen verwendete Shell in die Frage einbeziehen. Welches ist wahrscheinlich bash.
Raphael Ahrens
2
Dies scheint getan zu werden, um Befehlszeilenargumente zu analysieren. Wahrscheinlich möchten Sie etwas über Ihr Leben wissen getoptoder getoptses Ihnen leichter machen (oder das Leben dessen, der dies getan hat).
Carlos Campderrós

Antworten:

31

Dies ist ein Substring-Erweiterungsmuster (Unterklasse von Parameter Expansion) der Shell.

Das Format ist:

${parameter:offset:length}

und die Indizierung beginnt bei 0.

Angenommen, Sie haben eine Variable foo, dann ${foo:0:2}ergeben sich die ersten beiden Zeichen (ab Position 0 die nächsten 2).

Beispiel:

$ foo=spamegg
$ echo "${foo:0:2}"
sp

In Ihrem Fall 1bezieht sich die erste Zahl auf den Variablennamen $1, dh das erste Argument, das über die Befehlszeile (im Hauptprogramm) oder an die Funktion übergeben wird.

Also in Ihrem Fall "${1:0:2}"wird:

  • Beginnen Sie mit dem Extrahieren des Teilstrings ab Index 0, dh ab dem ersten Zeichen

  • und fahren Sie mit den nächsten beiden Zeichen fort

Nach der Operation erhalten Sie die ersten beiden Zeichen (bei 0 und 1 indiziert) der Eingabezeichenfolge.

Mit [ "${1:0:2}" != $rowArgName ]und [ "${1:0:2}" != $colArgName ]wird überprüft, ob der Ausgabe-Teilstring mit einigen anderen Zeichenfolgen übereinstimmt.

heemayl
quelle
1
Im Wesentlichen wird überprüft, ob der Benutzer $ 1 mit -coder bereitgestellt hat oder nicht -r, die wahrscheinlich besser mitgetopts
Sergiy Kolodyazhnyy
15

Ein kleiner Auszug aus man bash:

$ {parameter: offset: length}

Substring-Erweiterung . Wird auf bis zu lengthZeichen des Werts erweitert, der parameterbei dem durch angegebenen Zeichen beginnt offset. Wenn parameter ist @, ein indiziertes Array, das mit @oder subskribiert ist , *oder ein assoziativer Arrayname, unterscheiden sich die Ergebnisse wie unten beschrieben. Wenn dies lengthweggelassen wird, wird die Teilzeichenfolge des Werts, der parametermit dem durch angegebenen Zeichen beginnt offset und sich bis zum Ende des Werts erstreckt, erweitert. length und offset sind arithmetische Ausdrücke (siehe ARITHMETISCHE BEWERTUNG unten).

Ralph Rönnquist
quelle
5

Dies ist eine einfache Teilstring-Extraktion aus einer Variablen. Die betreffende Variable ist der erste Parameter des Skripts (das ist 1).

Wenn ich eine Variable habe, FOO, kann ich die ersten beiden Zeichen ihres Wertes mit sehen ${FOO:0:2}. Dasselbe geschieht in Ihrem Beispiel mit dem ersten Argument.

DopeGhoti
quelle