Как использовать оболочку script, чтобы проверить, существует ли ведро?
У меня установлен aws
cli. Я просто не знаю, как это сделать в оболочке script.
когда я запускаю команду aws s3 ls s3://bucket
, это даст мне что-то вроде этого
При вызове операции ListObjects произошла ошибка клиента (NoSuchBucket): указанное ведро не существует
Это означает, что ведро не существует. Поэтому я хочу запустить это из оболочки script и проверить, найден ли grep
. Но моя команда не работает.
if [ $(aws s3 ls "s3://$S3_BUCKET" | grep 'NoSuchBucket' &> /dev/null) == 0 ]
then
echo "$S3_BUCKET doesn\'t exist please check again"
exit
fi
Он просто дал мне это
backup.sh: 20: [: 0: неожиданный оператор
Обновление
Я изменил script на
echo "S3_BUCKET=$S3_BUCKET"
if aws s3 ls "s3://$S3_BUCKET" | grep -q 'AllAccessDisabled'
then
echo "$S3_BUCKET doesn\'t exist please check again"
exit
fi
И это результат, который я получил
A client error (AllAccessDisabled) occurred when calling the ListObjects operation: All access to this object has been disabled
Итак, текст содержит AllAccessDisabled
, но я все еще не echo
в следующей строке.
Ответы
Ответ 1
Указанный вами код не дал бы вам эту ошибку.
Если вы написали script без пробела между ведущими [
и $(
, которые будут иметь.
Также grep не собирается выводить 0
в этом случае, так что тест не будет работать так, как вы хотите.
Если вы хотите проверить, что grep
что-то найдено, вы хотите использовать аргумент -q
для grep
следующим образом:
if aws s3 ls "s3://$S3_BUCKET" 2>&1 | grep -q 'NoSuchBucket'
then
Ответ 2
Head-bucket s3api является более прямым и не несет расходов за перечисление ведра с большим количеством файлов.
http://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html
if aws s3api head-bucket --bucket "$S3_BUCKET" 2>/dev/null; then
Ответ 3
Вот как я это сделал, другой ответ скажет, что есть ведро, если есть ошибка AWS, которая не содержит "NoSuchBucket", например, срок действия токена
echo "Checking S3 bucket exists..."
BUCKET_EXISTS=true
S3_CHECK=$(aws s3 ls "s3://${BUCKET_NAME}" 2>&1)
#Some sort of error happened with s3 check
if [ $? != 0 ]
then
NO_BUCKET_CHECK=$(echo $S3_CHECK | grep -c 'NoSuchBucket')
if [ $NO_BUCKET_CHECK = 1 ]; then
echo "Bucket does not exist"
BUCKET_EXISTS=false
else
echo "Error checking S3 Bucket"
echo "$S3_CHECK"
exit 1
fi
else
echo "Bucket exists"
fi
Ответ 4
Способ, рекомендуемый aws, - aws s3api head-bucket --bucket $S3_BUCKET
См. Https://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html.
Ответ 5
это может мне простейший подход
if aws s3 ls "s3://$S3_BUCKET" 2>&1 | grep -q 'An error occurred'
then
echo "bucket does not exit or permission is not there to view it."
else
echo "bucket exit"
fi
Ответ 6
Я знаю, что это старый вопрос, но я пришел сюда за некоторыми ответами и использовал некоторые существующие ответы, и некоторые мои собственные эксперименты придумали скрипт, который обрабатывает различные возвращаемые значения:
bucketstatus=$(aws s3api head-bucket --bucket "${s3_bucket}" 2>&1)
if echo "${bucketstatus}" | grep 'Not Found';
then
echo "bucket does not exist";
elif echo "${bucketstatus}" | grep 'Forbidden';
then
echo "Bucket exists but not owned"
elif echo "${bucketstatus}" | grep 'Bad Request';
then
echo "Bucket name specified is less than 3 or greater than 63 characters"
else
echo "Bucket owned and exists";
fi
Ответ 7
#!/bin/bash
if [[ -z $(aws s3api head-bucket --bucket my-bucket) ]]; then
echo "bucket exists"
else
echo "bucket does not exist or permission is not there to view it."
fi