我安装了aws
个cli。我只是不确定如何在shell脚本中执行此操作。
当我运行命令aws s3 ls s3://bucket
时,它会给我这样的东西
调用ListObjects操作时发生客户端错误(NoSuchBucket):指定的存储桶不存在
这意味着存储桶不存在。所以我想从shell脚本运行它并检查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
下一行。
答案 0 :(得分:23)
s3api head-bucket更直接,不会产生列出包含大量文件的存储桶的费用。
http://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html
if aws s3api head-bucket --bucket "$S3_BUCKET" 2>/dev/null; then
答案 1 :(得分:10)
您列出的代码不会给您错误。
如果您编写的脚本没有前导[
和$(
之间的空格。
在这种情况下,grep也不会输出0
,因此测试无法按照您想要的方式运行。
如果您想测试grep
是否找到了任何内容,那么您想要-q
grep
这样的参数:
if aws s3 ls "s3://$S3_BUCKET" 2>&1 | grep -q 'NoSuchBucket'
then
答案 2 :(得分:2)
以下是我的方法,另一个答案是,如果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
答案 3 :(得分:1)
aws推荐的方式是aws s3api head-bucket --bucket $S3_BUCKET
参见https://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html
答案 4 :(得分:1)
没有必要处理错误:
if [[ ! -z $(aws s3api list-buckets --query 'Buckets[?Name==`bucket-name`]' --output text) ]]; then
echo "Bucket Exists"
fi
答案 5 :(得分: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
答案 6 :(得分:0)
我知道这是一个古老的问题,但是我来这里是为了找到一些答案,并使用了一些现有的答案,而我自己做了一些实验,提出了一个处理不同返回值的脚本:
bucketstatus=$(aws s3api head-bucket --bucket ${s3_bucket} 2>&1)
if echo ${bucketstatus} | grep 'Not Found';
then
echo "bucket doesn't 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 :(得分:0)
#!/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
答案 8 :(得分:0)
我偶然发现了这个问题,并想通过head-bucket
使用AWS推荐的方式添加解决方案。
BUCKET_EXISTS=$(aws s3api head-bucket --bucket <bucket_name> 2>&1 || true)
if [ -z "$BUCKET_EXISTS" ]; then
echo "Bucket exists"
else
echo "Bucket does not exist"
fi