linux - 在 Bash 中捕获逻辑的返回输出

标签 linux bash amazon-s3 scripting

这不是一个特别难的问题,但我刚开始使用 Bash,有几件事让我感到困惑。我试图将一些备份自动化到 AWS S3,但也向它添加了一些逻辑。我希望代码看起来像这样:

  1. 确保用户在调用脚本时传递了他们想要复制的$FOLDER,如果没有,警告并退出即sh backup.sh logfolder
  2. 检查桶是否存在,桶名是服务器的$HOSTNAME
  3. 如果桶不存在,警告并创建,否则继续
  4. 将文件从本地 $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/

相关文章:

bash - 从 crontab 运行 bash 脚本

bash - 如何让 grep 从指定的行号开始搜索

linux - Gammu runonreceive 不传递变量

linux - linux 上的 eclipse-mars : black background color in Tooltip's

java - 在 Linux 2 中用 java 编译 Cplex

mysql - 自动将 csv 文件传输到 MySQL

amazon-web-services - 由于变量太长,AWS CLI S3 COPY 命令获取 FINDSTR 错误?

javascript - AWS SDK 预签名 URL + 分段上传

php - 强制 Amazon S3 JPG 下载 - 附件标题 URL

c - 'less' linux 命令的备用程序/使 'less' 安全