
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
value: -1
- Was macht das eigentlich?rm /data/log || true
- Was||true
macht das?
Antwort1
${value: -1}
erweitert sich zumletztes Zeichendes Variableninhalts.
${value:-1}
Istandersaus ${value: -1}
!
In Bezug aufShell-Parametererweiterungim Handbuch:
${value:-1}
wird auf den Inhalt dervalue
Variable erweitert oder, wenn die Variable nicht gesetzt oder leer ist, auf die Zeichenfolge „1“${value: -1}
ist eine Kurzform der${var:offset:length}
Methode, um einen Teilstring des Variableninhalts zu extrahieren. Ein Offset von-1
bedeutet "ein Zeichen vom Ende des Strings". Der:length
Teil fehlt, daher wird der Teilstring vomoffset
Ende 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 || true
ist (meiner bescheidenen Erfahrung nach) nur dann sinnvoll, wenn das Skript mit ausgeführt wird set -e
. set -e
bewirkt, dass die Shell beendet wird, wenn ein Befehl mit einem Fehlerstatus beendet wird. Der Ersteller des Skripts war sich des -f
Flags 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 value
null 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.
|| true
stellt 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.