Überprüfen Sie, ob ein Bash-Skript genau zwei Argumente enthält, die Verzeichnisse sind

8

Ich schreibe ein Bash-Skript, das zwei Verzeichnisse vergleicht, bin mir aber nicht sicher, wie ich die Bedingungen überprüfen soll

Wenn der Benutzer beispielsweise 1 Argument anstelle von 2 eingibt (wir benötigen 2, da wir zwei Verzeichnisse vergleichen), sollte ein Fehler ausgegeben werden. Wenn beide Argumente gültig sind, vergleichen Sie die Verzeichnisse und geben Sie sie in eine Datei aus.

Asura
quelle
1
Willkommen auf der Seite! Bitte nehmen Sie sich einen Moment Zeit und lesen Sie unsere Hilfe, um zu verstehen, wie die Website funktioniert. Sie haben jetzt 6 Fragen gestellt und keine einzige Antwort akzeptiert. Beantwortet keine der Antworten, die Sie erhalten haben, Ihre Fragen?
Terdon

Antworten:

8

Argumente verarbeiten

Die Verarbeitung von Argumenten, die über die Befehlszeile eines Skripts übergeben werden, ist wie folgt. Angenommen, wir hätten dieses Skript:

$ cat cmd.bash 
#!/bin/bash

echo "arg1: $1"
echo "arg2: $2"

Führen Sie jetzt ohne Argumente aus:

$ ./cmd.bash 
arg1: 
arg2: 

Mit 1 Argument:

$ ./cmd.bash hi
arg1: hi
arg2: 

Mit 2 Argumenten:

$ ./cmd.bash hi bye
arg1: hi
arg2: bye

Überprüfen Sie die Argumente

Sie können dann überprüfen, ob die Argumente 1 und 2 gültige Verzeichnisse sind oder nicht, und dann aussteigen oder nach Bedarf fortfahren. Wir führen also zwei Überprüfungen ein, um festzustellen, ob die beiden Argumente Verzeichnisse sind oder nicht. Wenn nicht, beenden Sie das Programm.

$ cat cmd.bash
#!/bin/bash

[ -d "$1" ] || exit
[ -d "$2" ] || exit
[ $# == 2 ] || exit

echo "arg1: $1"
echo "arg2: $2"

Beispiel

Angenommen, wir haben diese Verzeichnisse.

$ mkdir d1 d2

$ ls -l
total 12
-rwxrwxr-x. 1 saml saml   89 Oct 14 23:13 cmd.bash
drwxrwxr-x. 2 saml saml 4096 Oct 14 23:14 d1
drwxrwxr-x. 2 saml saml 4096 Oct 14 23:14 d2

Wenn wir etwas anderes als 2 Verzeichnisse erhalten, wird das Skript einfach beendet.

$ ./cmd.bash hi bye

Wenn wir 2 Verzeichnisse haben:

$ ./cmd.bash d1 d2
arg1: d1
arg2: d2

Wenn wir mehr als 2 Argumente erhalten:

$ ./cmd.bash d1 d2 d3

Den Vergleich der beiden Verzeichnisse überlasse ich Ihnen. Um Bash zu lernen, verweise ich Sie auf den unten stehenden Link, um ein kostenloses Online-Buch über Bash zu erhalten.

Verweise

slm
quelle
Vielen Dank für die Erklärung, aber wenn Sie ein drittes Argument eingeben, druckt es immer noch Argument 1 und Argument 2. Ich möchte ein robustes Skript schreiben, das alle möglichen Szenarien überprüft ...
Asura
@asura - siehe Update, Überprüfung der Anzahl der Argumente hinzugefügt.
slm
@asura - Wenn die A'er, die Sie erhalten haben, Ihr Problem lösen, denken Sie bitte daran, sich einen Moment Zeit zu nehmen und auf das Häkchen neben ihnen zu klicken, damit andere wissen, dass Ihre Fragen gelöst wurden.
slm
Ich habe [$ # == 2] || hinzugefügt beenden und es scheint nicht zu funktionieren. Was bedeutet das? Wenn # of arg 2 ist, beenden Sie? Außerdem muss ich mehr Dinge überprüfen und ich kann mir nur vorstellen, mehrere "Wenn" zu verwenden, um dies zu tun ... zum Beispiel 1, wenn arg nicht genau 2 ist -> Fehler geben und beenden. 2, wenn 2 arg aber eins oder beide ungültig sind -> error und exit. 3, Wenn beide, beenden. 4, wenn 2 gültiges Argument -> Inhalt von Verzeichnissen vergleichen und in eine Datei ausgeben.
Asura
1
@asura - bitte auch nicht den Mid-Stream des Q ändern. Wenn Sie ein anderes Ziel vor Augen hatten, hätte dies Ihr Q sein sollen. Als ich darauf geantwortet habe, habe ich Ihnen einen Weg gezeigt, wie Sie es tun können (den Weg des Anfängers). Es gibt effizientere Methoden, aber angesichts Ihres rudimentären Q habe ich Ihnen ein grundlegendes A gezeigt.
slm
7

Die Anzahl der Argumente ist im Parameter enthalten$# .

if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 DIRECTORY1 DIRECTORY2"
  exit 3
fi

Wenn Sie erzwingen möchten, dass die Argumente beide Verzeichnisse sind (im Gegensatz zu anderen Dateitypen), testen Sie sie mit -d.

Das Dienstprogramm diffvergleicht zwei Dateien. Mit dieser Option -rwerden Verzeichnisse rekursiv verglichen.

diff -ru -- "$1" "$2"
Gilles 'SO - hör auf böse zu sein'
quelle