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

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

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 statt 2 eingibt (wir benötigen 2, da wir zwei Verzeichnisse vergleichen), sollte ein Fehler auftreten. Wenn beide Argumente gültig sind, vergleichen Sie die Verzeichnisse und geben Sie sie in eine Datei aus.

Antwort1

Argumente verarbeiten

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

$ cat cmd.bash 
#!/bin/bash

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

Führen Sie es 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üfung der Argumente

Sie können dann prüfen, ob die Argumente 1 und 2 gültige Verzeichnisse sind oder nicht, und dann nach Bedarf abbrechen oder fortfahren. Wir führen also zwei Prüfungen ein, um zu sehen, 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 uns etwas anderes als zwei Verzeichnisse angegeben werden, wird das Skript einfach beendet.

$ ./cmd.bash hi bye

Wenn uns 2 Verzeichnisse gegeben sind:

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

Wenn uns mehr als 2 Argumente gegeben werden:

$ ./cmd.bash d1 d2 d3

Den Vergleich der beiden Verzeichnisse überlasse ich Ihnen. Wenn Sie Bash lernen möchten, verweise ich Sie auf den unten stehenden Link zu einem kostenlosen Online-Buch zu Bash.

Verweise

Antwort2

Die Anzahl der Argumente liegt imParameter$#.

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 (und nicht andere Dateitypen), testen Sie sie mit-d.

Das Dienstprogrammdiffvergleicht zwei Dateien. Mit der Option -rvergleicht es Verzeichnisse rekursiv.

diff -ru -- "$1" "$2"

verwandte Informationen