2017-02-20 62 views
1

这不是一个特别困难的问题,但我开始在Bash中,有几件事情让我绊倒。我正在尝试将一些备份自动化到AWS S3,同时也为其添加了一些逻辑。我想要的代码如下所示:在Bash中捕获逻辑的返回输出

  1. 确保用户通过他们想要的东西$FOLDER调用脚本的时候复制,如果没有,警告和退出,即如果桶中存在sh backup.sh logfolder
  2. 检查,斗名称为服务器
  3. 如果桶不存在,警告和创造,对
  4. 其他移动从本地$FOLDER到S3存储和$FOLDER指定移动文件的$HOSTNAME

一个简单的方式来总是运行命令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 

回答

0

我不能完全肯定,但你似乎混淆& 1和$ 1。表达式'2> & 1'表示通常转到标准错误的输出被重定向到标准输出(参见In the shell, what does " 2>&1 " mean?)。

恕我直言,这应该工作:

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

谢谢你的提示,我觉得你说得对,我的困惑。您发送的命令仍然不起作用,但我认为它正在推动我朝着正确的方向前进。谢谢 – CodeChris

+0

好吧,那么也许命令不仅仅是“NoSuchBucket”。也许你可以提供你的脚本和你得到的输出以获得进一步的帮助。 – Markus

+0

它是,但我添加了输出的整个文本字符串。我会发布脚本,然后发生错误; 这给出了这些错误,它们对应于第一个文件夹和第一个ELIF中的IF。s3backup.sh:第30行:[:=:一元运算符预期 s3backup。sh:第35行:[:=:一元运算符预期 如果接着回到else和echo“Bucket does exist”否则,我推测 – CodeChris