2017-02-20 7 views
1

これは特に難しい問題ではありませんが、私はBashから始めていますが、いくつかのことが私を立ち上げています。私はAWS S3へのいくつかのバックアップを自動化しようとしていますが、それに少しのロジックも追加しています。私はこのようにしてコーディングしたい:Bashでロジックの返された出力をキャプチャ

  1. ユーザーは、彼らがスクリプトを呼び出すときに、コピーしたいもの$FOLDER経過していることを確認し、そうでない場合は、警告して終了バケットが存在する場合sh backup.sh logfolder
  2. チェックすなわち、バケット名であることサーバー
  3. バケットが指定した地域のS3バケットへ$FOLDER$FOLDERからファイルを移動し、存在し、
  4. 上の他の動きを警告して作成されない場合の$HOSTNAME

常にコマンドaws s3 mb s3://$HOSTNAMEを実行するための簡単な方法が、これは、それはそう他、aws s3 ls s3://$HOSTNAMEのようなものを実行すると、出力がNoSuchBucketが、その後バケットを作成する含まれている場合に存在するほぼすべての状況下として無駄な縫い目(バケットがある)、その後の動きonをmoveコマンドに渡します。

2> &1を使用し、変数名$1でこれを呼び出すことができましたが、最初に$1を使用して開始時にフォルダ名を渡しています。私が持っていたもう一つの問題は、コマンドを実行してから出力をチェックすることでした。私はコマンドである変数を作成しますか?あるいは、コマンドを実行して出力を変数に入れ、出力を検索しますか? $ 1 = NoSuchBucketその後、バケツ、他のコピーファイルを作成する場合、すなわち何か1または2

1)BUCKETCHECK=$(aws s3 mb s3://$HOSTNAME/) 2> &1

$ 1 = NoSuchBucket場合は、aws s3 ls s3://$HOSTNAME/ 2> &1

)、それ以外のコピーファイル

2のバケットを作成

2つのどちらも正しいとは限りませんか?

スクリプト:

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'は、通常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 
+0

おかげで、私はあなたが私の混乱についての権利だと思います。あなたが送ったコマンドはまだ動作しませんが、私はそれが私に正しい方向へのプッシュを与えていると思います。ありがとう – CodeChris

+0

それでは、コマンドは単に "NoSuchBucket"以上のものを出しているかもしれません。おそらくあなたはあなたのスクリプトを提供することができ、あなたはさらなる支援のためにどんな出力を得ているのでしょうか。 – Markus

+0

ですが、出力されるテキスト文字列全体を追加しました。私はスクリプトを投稿し、その後エラーが発生します。 これらのエラーは、最初のフォルダのIFと最初のELIFに対応しています。 s3backup.sh:行30:[:=:単項演算子の期待値 s3backup。sh:行35:[:=:単項演算子が期待しています それ以外の場合は、「バケットは存在します」と表示されますが、チェックしたとおりではないので、バケットチェックセクションが好きではありません。それ以外の場合は – CodeChris

関連する問題