私のコンピュータをローカルサーバーにバックアップするためのbashスクリプトを書いています。アーカイブを圧縮する必要がありますが、内部sshコマンドでif条件がどのように機能するかを見つけることができません。
if [ ssh [email protected] '$(ls -d /snapshots/$(date -v -7d +%Y%m%d)* 2> /dev/null | wc -l) != "0"' ]
then
ssh [email protected] "tar -czf $ARCHIVES_DIR/$YESTERDAY.tar.gz $SNAPSHOT_DIR/$YESTERDAY* \
&& rm -rf $SNAPSHOT_DIR/$YESTERDAY*"
fi
「引数が多すぎます」(if内で)エラーが発生します。
私は何が間違っていましたか?
ベストアンサー1
構成を簡素化し、コードを読む次の人に何が起こっているのかを理解する機会を提供することをお勧めします。主な問題は、間接実行$( ... )
と[ ... ]
テスト演算子を混同しているようです。流れを間違って理解したら謝ります。しかし、意図したことは次のとおりです。
# Count files on the remote system and confirm that there is at least one
DATE7=$(date -v -7d '+%Y%m%d')
NFILES=$(ssh [email protected] "ls -d '/snapshots/$DATE7'* 2> /dev/null | wc -l")
# If the ssh worked and we have found files then archive them
if [ $? -eq 0 && 0 -lt $NFILES ]
then
# Archive the files
ssh [email protected] "
tar -czf '$ARCHIVES_DIR/$YESTERDAY.tar.gz' '$SNAPSHOT_DIR/$YESTERDAY'* &&
rm -rf '$SNAPSHOT_DIR/$YESTERDAY'
"
fi
これはARCHIVES_DIR
、SNAPSHOT_DIR
およびYESTERDAY
スクリプトの他の場所でローカルに定義されていると仮定します。
"..."
変数の値はすぐに挿入されますが、'...'
テキストは$WIDGET
ドル記号で始まるリテラル7文字の文字列として扱われます。このコードには、" '...' "
などのシーケンスがあることを考慮すると、これは注目に値します。' "..." '