Zweck des Doppelpunkts bei der Variablenerweiterung

Zweck des Doppelpunkts bei der Variablenerweiterung

Ich überprüfe ein altes Shell-Skript. Zwei Dinge darin verstehe ich nicht.

rm /data/log || true

value=$(cat /datafile)
if [ ${value: -1} ==  0 ] 
 then echo 'do'
else echo 'dont'
 fi
  1. value: -1- Was macht das eigentlich?
  2. rm /data/log || true- Was ||truemacht das?

Antwort1

${value: -1}erweitert sich zumletztes Zeichendes Variableninhalts.

${value:-1}Istandersaus ${value: -1}!

In Bezug aufShell-Parametererweiterungim Handbuch:

  1. ${value:-1}wird auf den Inhalt der valueVariable erweitert oder, wenn die Variable nicht gesetzt oder leer ist, auf die Zeichenfolge „1“

  2. ${value: -1}ist eine Kurzform der ${var:offset:length}Methode, um einen Teilstring des Variableninhalts zu extrahieren. Ein Offset von -1bedeutet "ein Zeichen vom Ende des Strings". Der :lengthTeil fehlt, daher wird der Teilstring vom offsetEnde des Strings bis zum Ende des Strings entnommen.

    Im Handbuch steht:

    Beachten Sie, dass ein negativer Offset durch mindestens ein Leerzeichen vom Doppelpunkt getrennt sein muss, um eine Verwechslung mit der Erweiterung „:-“ zu vermeiden.

Antwort2

rm /data/log || trueist (meiner bescheidenen Erfahrung nach) nur dann sinnvoll, wenn das Skript mit ausgeführt wird set -e. set -ebewirkt, dass die Shell beendet wird, wenn ein Befehl mit einem Fehlerstatus beendet wird. Der Ersteller des Skripts war sich des -fFlags für anscheinend nicht bewusst rm.

${value: -1}ist wahrscheinlich ein Tippfehler. Es sollte lauten ${value:-1}und den Standardwert (1, nicht -1; das -ist Teil der :-Syntax) für die Variablenerweiterung angeben, wenn valuenull oder nicht festgelegt ist.

Wenn es wirklich heißen sollte ${value: -1}, erfahren Sie die tatsächliche Bedeutung in der Antwort von Glenn Jackman.

Antwort3

Aus bash(1): ${parameter:-word} Standardwerte verwenden. Wenn der Parameter nicht gesetzt oder null ist, wird die Erweiterung von word ersetzt. Andernfalls wird der Wert des Parameters ersetzt.

|| truestellt sicher, dass der Befehl „true“ zurückgibt. ||ist ein kurzschließender ODER-Operator. Wenn der vorherige Befehl „false“ zurückgibt, wird der folgende Befehl ausgeführt und der Rückgabewert verwendet.

verwandte Informationen