
Ich versuche, ein Skript zu schreiben, das eine Benutzerinteraktion erfordert. Im Wesentlichen muss das Skript den Benutzer nach drei Parametern fragen: dem Namen der Datei(en), die der Benutzer finden möchte, der Anzahl der Tage, an denen die Datei(en) geändert wurden, und dem Namen eines Tar-Archivs. Wenn alle Parameter bekannt sind, muss das Skript die entsprechenden Dateien finden und sie in ein Archiv mit einem bestimmten Namen umwandeln. Wenn ich einen einzelnen Befehl in das Terminal schreibe:
find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -
es funktioniert gut. Wie kann ich eine von einem Benutzer eingegebene Variable verwenden, um den Befehl aufzurufen, der sich im selben Skript befindet? Mein Skript erstellt ein leeres Archiv.
Mein Skript:
echo "Enter a number of days"
read days
echo "Enter the name of file"
read nameoffile
echo "Enter the name of tar archive"
read nameofarchive
find -name '"$nameoffile"' -mtime -"$days" | tar -cvf "$nameofarchive".tar.gz -T -
Antwort1
Versuchen Sie, die zusätzlichen '
Anführungszeichen zu entfernen in'"$nameoffile"'
Beispiel:
maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile
Wenn Sie einfache Anführungszeichen benötigen, maskieren Sie diese wie folgt:
echo \'$nameoffile\'
'myFile'
Antwort2
Generell ist es keine gute Idee, eine Benutzerinteraktion zu erfordern. Ihr Skript lässt sich dadurch nicht automatisieren und wird für Ihre Benutzer sehr schwer zu verwenden, da sie die Eingaben in einer Umgebung manuell vornehmen müssen, in der die Tab-Vervollständigung nicht möglich ist.
Seit @maulinglawnsbereits erklärtwarum Ihr Skript fehlgeschlagen ist, zeige ich Ihnen eine einfachere Vorgehensweise, bei der Ihre Benutzer die Informationen nicht mühsam eintippen müssen:
#!/usr/bin/env sh
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
Um dann Dateien mit dem Namen zu finden foo.txt
, die in den letzten 3 Tagen geändert wurden, und sie in bar.tar.gz zu archivieren, führen Sie Folgendes aus:
script.sh 3 foo.txt bar
Sie können auch eine einfache Fehlerprüfung hinzufügen, um sicherzustellen, dass das Skript immer mit der richtigen Anzahl Parameter ausgeführt wird:
#!/usr/bin/env sh
if [ $# -ne 3 ]; then
echo "You need to enter three arguments"
exit 1
fi
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
Antwort3
read unterstützt beispielsweise die Benennung von Variablen;
#!/bin/bash
read -p "How many files? (0-100) " VAR_NUMBER_OF_FILES
read -p "How many days? (0-100) " VAR_NUMBER_OF_DAYS
read -p "Tar file name? " VAR_TAR_NAME
...
find -name '"$VAR_NUMBER_OF_FILES"' -mtime -"$VAR_NUMBER_OF_DAYS" | tar -cvf "$VAR_TAR_NAME".tar.gz -T -