2017-02-20 4 views
1

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

  1. Sicherstellen, dass der Benutzer übergeben hat, welche $FOLDER sie kopieren möchten, wenn das Skript aufrufen, wenn nicht, warnen und Ausfahrt dh sh backup.sh logfolder
  2. Überprüfen Sie, ob der Eimer vorhanden ist, die sein Eimer Name der $HOSTNAME des Servers
  3. Wenn der Eimer nicht vorhanden ist, warnen und schaffen, sonst bewegen sich auf
  4. 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 

Antwort

0

Ich bin nicht ganz sicher, aber Sie scheinen & 1 und $ 1 zu verwirren. Der Ausdruck '2> & 1' bedeutet, dass die Ausgabe, die normalerweise zu stderr gehen würde, auf stdout umgeleitet wird (siehe In the shell, what does " 2>&1 " mean?).

Imho sollte diese Arbeit:

BUCKETCHECK=$(aws s3 mb s3://$HOSTNAME/ 2>&1) 
if [ "$BUCKETCHECK" = "NoSuchBucket" ]; then 
    echo create bucket; 
fi 
+0

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

+0

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

+0

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