2017-02-20 20 views
1

Это не особо сложный вопрос, но я начинаю работать в Bash, и некоторые вещи меня отключают. Я пытаюсь автоматизировать некоторые резервные копии для AWS S3, но также добавить немного логики. Я хочу, чтобы код, чтобы выглядеть следующим образом:Захват возвращенного вывода для логики в Bash

  1. Убедитесь, что пользователь прошел, что $FOLDER они хотят, чтобы скопировать при вызове сценария, если нет, то предупредить и выход т sh backup.sh logfolder
  2. Проверьте ведро существует, имя ведро является $HOSTNAME сервера
  3. Если ведро не существует, предупреждают и создавать, еще шаг на
  4. Перемещение файлов из локальной $FOLDER в ведро S3 и $FOLDER указанного

Простой способ всегда запускать команду aws s3 mb s3://$HOSTNAME, но этот шов расточительный, поскольку почти при любых обстоятельствах он будет существовать, так что работает что-то вроде aws s3 ls s3://$HOSTNAME, и если на выходе содержится NoSuchBucket, тогда создайте ведро, иначе (там есть ведро), затем переместите на команду перемещения.

Я видел, я мог бы использовать 2> &1, а затем вызвать это с именем переменной $1, однако я уже использую $1 передать имя папки на старте. Другая проблема, с которой я столкнулся, - это запустить команду, а затем проверить выход. Создать ли переменную, которая является командой? Или просто запустите команду и поместите вывод в переменную, а затем выполните поиск вывода? Т.е. что-то 1 или 2

1) BUCKETCHECK=$(aws s3 mb s3://$HOSTNAME/) 2> &1

если $ 1 = NoSuchBucket затем создать ведро, иначе копировать файлы

2) aws s3 ls s3://$HOSTNAME/ 2> &1

если $ 1 = NoSuchBucket затем создать ведро, файлы еще копию

Возможно, ни одна из двух не верна?

Сценарий:

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 

ответ

0

Я не совсем уверен, но, кажется, путают & 1 и $ 1. Выражение '2> & 1' означает, что выход, который обычно переходит в stderr, перенаправляется на stdout (см. In the shell, what does " 2>&1 " mean?).

Имхо это должно работать:

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

Спасибо за совет, я думаю, вы правы насчет моего замешательства. Команда, которую вы отправили, все еще не работает, но я думаю, что это дает мне толчок в правильном направлении. Спасибо – CodeChris

+0

Хорошо, тогда, возможно, команда выставляет больше, чем просто «NoSuchBucket». Возможно, вы можете предоставить свой сценарий и какой вывод вы получите для дальнейшей помощи. – Markus

+0

Это, но я добавил всю текстовую строку, которая выводится. Я отправлю сценарий, а затем ошибку, которая случится; Это дает эти ошибки, они соответствуют IF в первой папке и первом ELIF s3backup.sh: строка 30: [: =: ожидаемый операционный оператор s3backup.sh: строка 35: [: =: ожидаемый унарный оператор Если затем идет в другое, а эхо «Bucket does exist», но это не так, как я проверял, так что ему не нравится раздел проверки на ведро, поэтому просто нужно else, я предполагаю, что – CodeChris