Ich habe ein Problem, das durch diese Antwort gelöst wirdhttps://superuser.com/a/508761
Jetzt muss ich es erweitern, um andere Dinge zu tun, aber zuerst muss ich besser verstehen, wie es funktioniert, bevor ich es ändern kann. Hier ist das betreffende Skript:
#!/bin/bash
(( $# != 2 )) && exit 1
for f in *; do
newf="${f//$1/$2}"
if [[ $f != $newf ]]; then
mv "$f" "$newf"
fi
done
Was macht (( $# != 2 )) && exit 1
das? Ich hatte wenig Glück, online Erklärungen zu finden: Ich habe herausgefunden, was jede Komponente ist, aber nicht, was die gesamte Zeile im Skript als Ganzes macht. Die Antwort hat diese Zeile nicht erklärt. Der Verfasser war zuletzt vor über 2 Jahren online und ich wollte keine 5 Jahre alte Frage wieder aufleben lassen, also bin ich hier.
Antwort1
Es ist ein Kontrolloperator
AusMann verprügeln:
Die Steueroperatoren && und || bezeichnen UND-Listen bzw. ODER-Listen. Eine UND-Liste hat die FormAKontrolloperatorIst
command1 && command2
Befehl2 wird genau dann ausgeführt, wenn Befehl1 einen Exit-Status von Null zurückgibt. [..schneiden..] Der Rückgabestatus von AND- und OR-Listen ist der Exit-Status des letzten Befehls. in der Liste ausgeführt.
Ein Token, das eine Kontrollfunktion ausführt. Es ist eines der folgenden Symbole: || & && ; ;; ( ) |
Lesen Sie es in diesem Fall also nicht &&
als Booleschen Operator. Sie wissen jetzt also, wann exit 1
es ausgeführt wird – nur bei Erfolg des vorherigen Befehls (wenn der Exit-Status Null war).
Sieh dir das anServerfehler-AntwortfürErklärung &&
in 3 verschiedenen Kontexten in Bash.Nützlich, um die Unterschiede zwischen ihnen zu lernen.
Antwort2
Es beendet das Skript an dieser Zeile, wenn nicht genau zwei Argumente an das Skript übergeben wurden.
$#
ist die Anzahl der Argumente, die beim Aufruf des Skripts übergeben werden, analog zuargc
C(( $# != 2 ))
gibt einen truey-Code (0
) zurück, wenn die Anzahl der Argumente ungleich ist2
&&
führt die rechte Seite nur aus, wenn die linke Seite mit einem Truey-Code beendet wurde. Das bedeutet, dass die rechte Seite ausgeführt wird, wenn die Anzahl der Argumente nicht 2 ist.exit 1
beendet das Skript mit dem falschen Exit-Code1
. Dadurch wird das Skript an dieser Stelle abgebrochen und der Anrufer darüber informiert, dass ein Fehler aufgetreten ist.