[英]Capturing returned output for logic in Bash
这不是一个特别难的问题,但我是从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(参见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.