繁体   English   中英

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

[英]Capturing returned output for logic in Bash

这不是一个特别难的问题,但我是从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(参见shell中,“2>&1”是什么意思? )。

Imho这应该工作:

BUCKETCHECK=$(aws s3 mb s3://$HOSTNAME/ 2>&1)
if [ "$BUCKETCHECK" = "NoSuchBucket" ]; then
  echo create bucket;
fi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM