这不是一个特别难的问题,但我刚开始使用 Bash,有几件事让我感到困惑。我试图将一些备份自动化到 AWS S3,但也向它添加了一些逻辑。我希望代码看起来像这样:
- 确保用户在调用脚本时传递了他们想要复制的
$FOLDER
,如果没有,警告并退出即sh backup.sh logfolder
- 检查桶是否存在,桶名是服务器的
$HOSTNAME
- 如果桶不存在,警告并创建,否则继续
- 将文件从本地
$FOLDER
移动到 S3 存储桶并指定$FOLDER
一种始终运行命令 aws s3 mb s3://$HOSTNAME
的简单方法,但这种接缝很浪费,因为在几乎所有情况下它都会存在,因此运行类似 aws s3 ls 的命令s3://$HOSTNAME
并且如果输出包含 NoSuchBucket 则创建存储桶,否则(存储桶在那里)然后继续移动命令。
我已经看到我可以使用 2> &1
然后用变量名 $1
调用它,但是我已经在使用 $1
来在开头传递文件夹名称。我遇到的另一个问题是如何运行命令,然后检查输出。我会创建一个变量作为命令吗?或者只是运行命令并将输出放入变量,然后搜索输出?即 1 或 2
1) BUCKETCHECK=$(aws s3 mb s3://$HOSTNAME/) 2> &1
如果 $1 = NoSuchBucket 则创建桶,否则复制文件
2) aws s3 ls s3://$HOSTNAME/2> &1
如果 $1 = NoSuchBucket 则创建桶,否则复制文件
或者两者都不正确?
脚本:
REGION="eu-west-1"
FOLDER=$1
# Debug Code
DEBUG=0
if [ ${DEBUG} = 1 ]
then
echo ${HOSTNAME}
echo ${FOLDER}
echo ${REGION}
fi
# Get function from functions library
#. /etc/init.d/functions
if [ ${FOLDER} = 0 ]
then
echo "Please input a folder name"
exit 1
BUCKETCHECK=$(aws s3 ls s3://$HOSTNAME/ 2>&1)
elif [ ${BUCKETCHECK} = "An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist" ]
then
echo "Creating Bucket"
aws s3 mb s3://${HOSTNAME}/
#elif [ ${FOLDERCHECK} = 0 ]
#then
# echo "Folder does not exist, will create it"
# aws s3 cp ${FOLDER} s3://${HOSTNAME}/${FOLDER}/
else
echo "Bucket does exist, moving files"
aws s3 mv ${FOLDER} s3://$HOSTNAME/${FOLDER}/ --recursive --region ${REGION}
fi
最佳答案
我不太确定,但您似乎混淆了 &1 和 $1。表达式 '2>&1' 表示将通常转到 stderr 的输出重定向到 stdout(请参阅 In the shell, what does " 2>&1 " mean? )。
恕我直言,这应该可行:
BUCKETCHECK=$(aws s3 mb s3://$HOSTNAME/ 2>&1)
if [ "$BUCKETCHECK" = "NoSuchBucket" ]; then
echo create bucket;
fi
关于linux - 在 Bash 中捕获逻辑的返回输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42343316/