toy*_*toy 13 bash shell ubuntu amazon-s3
我安装了awscli.我只是不确定如何在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
Run Code Online (Sandbox Code Playgroud)
它只是给了我这个
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
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出
A client error (AllAccessDisabled) occurred when calling the ListObjects operation: All access to this object has been disabled
Run Code Online (Sandbox Code Playgroud)
所以文本包含AllAccessDisabled但我仍然没有echo下一行.
小智 30
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
Run Code Online (Sandbox Code Playgroud)
Eta*_*ner 11
您列出的代码不会给您错误.
如果你编写的脚本没有前导[和$(那之间的空间.
0在这种情况下,grep也不会输出,因此测试不会按照您想要的方式运行.
如果你想测试是否grep找到任何东西,那么你想使用这个-q参数grep:
if aws s3 ls "s3://$S3_BUCKET" 2>&1 | grep -q 'NoSuchBucket'
then
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老问题,但我来到这里寻求一些答案并使用一些现有答案和我自己的一些实验想出了一个处理不同返回值的脚本:
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
Run Code Online (Sandbox Code Playgroud)
这是我的做法,如果存在不包含“NoSuchBucket”的 AWS 错误(例如令牌到期),另一个答案会说有一个存储桶
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
Run Code Online (Sandbox Code Playgroud)
aws推荐的方式是aws s3api head-bucket --bucket $S3_BUCKET
参见https://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html