2017-02-20 63 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