Das ist keine besonders schwierige Frage, aber ich bin in Bash angefangen und ein paar Dinge stolpern mich aus. Ich versuche, einige Backups auf AWS S3 zu automatisieren, aber auch ein wenig Logik hinzuzufügen. Ich möchte so aussehen kodieren:Capturing zurückgegebene Ausgabe für Logik in Bash
- Sicherstellen, dass der Benutzer übergeben hat, welche
$FOLDER
sie kopieren möchten, wenn das Skript aufrufen, wenn nicht, warnen und Ausfahrt dhsh backup.sh logfolder
- Überprüfen Sie, ob der Eimer vorhanden ist, die sein Eimer Name der
$HOSTNAME
des Servers - Wenn der Eimer nicht vorhanden ist, warnen und schaffen, sonst bewegen sich auf
- die Dateien aus dem lokalen
$FOLDER
in den S3 Eimer und$FOLDER
angegeben Bewegen
Ein einfacher Weg, um immer den Befehl ausführen aws s3 mb s3://$HOSTNAME
aber diese Nähen verschwenderisch wie unter allen Umständen fast wird es so läuft so etwas wie aws s3 ls s3://$HOSTNAME
existiert und wenn die Ausgabe enthält NoSuchBucket dann den Eimer schaffen, sonst (der Eimer ist es), dann bewegen auf den Verschiebebefehl.
Ich habe gesehen, ich 2> &1
verwenden könnte und diese dann rufen Sie mit dem Variablennamen $1
, jedoch bin ich schon $1
mit dem Ordnernamen beim Start zu übergeben. Das andere Problem, das ich hatte, war, wie man den Befehl ausführt, und dann die Ausgabe überprüfen. Würde ich eine Variable erstellen, die der Befehl ist? Oder einfach den Befehl ausführen und die Ausgabe in eine Variable schreiben, dann die Ausgabe durchsuchen? Dh etwas 1 oder 2
1) BUCKETCHECK=$(aws s3 mb s3://$HOSTNAME/) 2> &1
wenn $ 1 = NoSuchBucket dann Eimer erstellen, sonst Kopieren von Dateien
2) aws s3 ls s3://$HOSTNAME/ 2> &1
, wenn $ 1 = NoSuchBucket dann Eimer erstellen, sonst Kopieren von Dateien
Oder ist vielleicht keiner der beiden richtig?
Das Script:
REGION="eu-west-1"
FOLDER=$1
# Debug Code
DEBUG=0
if [ ${DEBUG} = 1 ]
then
echo ${HOSTNAME}
echo ${FOLDER}
echo ${REGION}
fi
# Get function from functions library
#. /etc/init.d/functions
if [ ${FOLDER} = 0 ]
then
echo "Please input a folder name"
exit 1
BUCKETCHECK=$(aws s3 ls s3://$HOSTNAME/ 2>&1)
elif [ ${BUCKETCHECK} = "An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist" ]
then
echo "Creating Bucket"
aws s3 mb s3://${HOSTNAME}/
#elif [ ${FOLDERCHECK} = 0 ]
#then
# echo "Folder does not exist, will create it"
# aws s3 cp ${FOLDER} s3://${HOSTNAME}/${FOLDER}/
else
echo "Bucket does exist, moving files"
aws s3 mv ${FOLDER} s3://$HOSTNAME/${FOLDER}/ --recursive --region ${REGION}
fi
Danke für den Tipp, ich glaube, Sie über meine Verwirrung richtig sind. Der Befehl, den Sie gesendet haben, funktioniert immer noch nicht, aber ich denke, er gibt mir den Druck in die richtige Richtung. Danke – CodeChris
Ok dann vielleicht gibt der Befehl mehr aus als nur "NoSuchBucket". Vielleicht können Sie Ihr Skript zur Verfügung stellen und welche Ausgabe Sie für weitere Unterstützung erhalten. – Markus
Es ist, aber ich habe die gesamte Textzeichenfolge hinzugefügt, die ausgegeben wird. Ich poste das Skript und dann den Fehler, der passiert; Dies gibt diese Fehler, sie entsprechen der IF auf dem ersten Ordner und der ersten ELIF s3backup.sh: Zeile 30: [: =: unärer Operator erwartet s3backup.sh: Zeile 35: [: =: unärer Operator erwartet Wenn dann zu anderen geht und Echos "Bucket existiert", aber es ist nicht so, wie ich es überprüft habe, so ist es nicht der Butckeck Check-Abschnitt so einfach zu gehen Ansonsten nehme ich an – CodeChris