Eu sugiro que você simplifique a construção e dê à próxima pessoa que estiver lendo o código a chance de ver o que está acontecendo. Seu principal problema é que você parece estar confundindo sua execução indireta $( ... ) com [ ... ] como um operador de teste. Desculpas se eu entendi mal o fluxo, mas acho que isso é o que você pretende:
# 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
Isso supõe que ARCHIVES_DIR , SNAPSHOT_DIR e YESTERDAY estão definidos localmente em outro lugar no seu script.
Lembre-se de que "..." interpola os valores das variáveis imediatamente, enquanto '...' tratará o texto como $WIDGET como uma cadeia de sete caracteres literais começando com um símbolo de dólar. Isso é importante observar, já que tenho seqüências como " '...' " e ' "..." ' neste código.