2015-06-26 23 views
6

Mam zainstalowane aws cli. Po prostu nie jestem pewien, jak to zrobić w skrypcie powłoki.Jak używać skryptu powłoki, aby sprawdzić, czy istnieje wiadro?

kiedy uruchomić komendę aws s3 ls s3://bucket byłoby dać mi coś takiego

błąd klienta (NoSuchBucket) wystąpił podczas wywoływania operacji ListObjects: Podany Łyżka nie istnieje

Oznacza to, że wiadro nie istnieje. Więc chcę uruchomić to ze skryptu powłoki i sprawdzić, czy znajdzie go grep. Ale moje polecenie nie działa.

if [ $(aws s3 ls "s3://$S3_BUCKET" | grep 'NoSuchBucket' &> /dev/null) == 0 ] 
then 
    echo "$S3_BUCKET doesn\'t exist please check again" 
    exit 
fi 

To po prostu dał mi ten

backup.sh: 20: [: 0: nieoczekiwany operator

Updated

zmieniłem skrypt być

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 

I to jest wyjście mam

A client error (AllAccessDisabled) occurred when calling the ListObjects operation: All access to this object has been disabled 

Więc tekst zawiera AllAccessDisabled ale nadal nie zrobić echo następnego wiersza.

Odpowiedz

6

Wymieniony kod nie dałby Ci tego błędu.

Jeśli napisałeś scenariusz bez spacji między wiodącym [ i $(, który by to zrobił.

Również grep nie wypisze w tym przypadku 0, aby test nie działał tak, jak chcesz.

Jeśli chcesz sprawdzić, czy grep znaleziono niczego czym chcesz użyć -q argument grep tak:

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

Nadal nie działa będę aktualizować moje pytanie. – toy

+0

To jest błąd wyjściowy. To prawdopodobnie spowoduje błąd standardowy, a nie standardowe wyjście. Musisz przekierować na to. Zobacz zaktualizowany kod. –

1

Oto jak to zrobiłem, druga odpowiedź powie jest wiadro, jeśli istnieje jest błędem AWS, która nie zawiera „NoSuchBucket” takie jak tokena upływie

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 głowy wiadro jest bardziej bezpośredni i nie ponosić kosztów wykazie wiadro z wielu plików.

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

To powinna być akceptowana odpowiedź. –

+1

Nie, nie powinno, ponieważ nie działa w przypadku, gdy wiadro jest własnością innego użytkownika: http://pasted.co/7dae7402 – scubbo

0

to może mi najprostsze podejście

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 
Powiązane problemy