Как использовать оболочку 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

Ответ 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                                                                                                                                                                                                                                            

Ответ 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