2015-06-26 2 views
6

У меня есть aws cli установлен. Я просто не уверен, как это сделать в сценарии оболочки.Как использовать сценарий оболочки для проверки наличия ведра?

при запуске команды aws s3 ls s3://bucket это дало бы мне что-то вроде этого

Ошибка клиента (NoSuchBucket) произошло при вызове операции ListObjects: Указанный ковш не существует

Это означает, что ковша не существует. Поэтому я хочу запустить это из сценария оболочки и проверить, найден ли его 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: неожиданный оператор

Обновлено

Я изменил сценарий, чтобы быть

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 следующую строку.

ответ

6

Код, указанный вами, не дал бы вам эту ошибку.

Если вы написали скрипт без пробела между ведущими [ и $(, которые будут иметь.

Также grep не собирается выводить 0 в таком случае, чтобы тест не работал так, как вы хотите.

Если вы хотите, чтобы проверить, нашел ли grep что-нибудь, то вы хотите использовать -q аргумент grep так:

if aws s3 ls "s3://$S3_BUCKET" 2>&1 | grep -q 'NoSuchBucket' 
then 
+1

Он по-прежнему не работает, я буду обновлять свой вопрос. – toy

+0

Это ошибка выхода. Вероятно, это будет стандартная ошибка, а не стандартный вывод. Для этого вам нужно перенаправить. См. Обновленный код. –

1

Вот как я это сделал, другой ответ будет сказать, что есть ведро, если ошибка 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                                                            
12

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 
+0

Это должен быть принятый ответ –

+1

Нет, этого не должно быть, потому что оно не работает в том случае, если ведро принадлежит другому пользователю: http://pasted.co/7dae7402 – scubbo

0

это может меня простой подход

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 
Смежные вопросы