Это не особо сложный вопрос, но я начинаю работать в Bash, и некоторые вещи меня отключают. Я пытаюсь автоматизировать некоторые резервные копии для AWS S3, но также добавить немного логики. Я хочу, чтобы код, чтобы выглядеть следующим образом:Захват возвращенного вывода для логики в Bash
- Убедитесь, что пользователь прошел, что
$FOLDER
они хотят, чтобы скопировать при вызове сценария, если нет, то предупредить и выход тsh backup.sh logfolder
- Проверьте ведро существует, имя ведро является
$HOSTNAME
сервера - Если ведро не существует, предупреждают и создавать, еще шаг на
- Перемещение файлов из локальной
$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
Спасибо за совет, я думаю, вы правы насчет моего замешательства. Команда, которую вы отправили, все еще не работает, но я думаю, что это дает мне толчок в правильном направлении. Спасибо – CodeChris
Хорошо, тогда, возможно, команда выставляет больше, чем просто «NoSuchBucket». Возможно, вы можете предоставить свой сценарий и какой вывод вы получите для дальнейшей помощи. – Markus
Это, но я добавил всю текстовую строку, которая выводится. Я отправлю сценарий, а затем ошибку, которая случится; Это дает эти ошибки, они соответствуют IF в первой папке и первом ELIF s3backup.sh: строка 30: [: =: ожидаемый операционный оператор s3backup.sh: строка 35: [: =: ожидаемый унарный оператор Если затем идет в другое, а эхо «Bucket does exist», но это не так, как я проверял, так что ему не нравится раздел проверки на ведро, поэтому просто нужно else, я предполагаю, что – CodeChris