Aqui está um cenário possível. Coloque seu código rsync existente ( if [[ -d $DESTINATION ... )
em uma função shell, digamos runbackup ,
e substitua a parte que faz . $CONFIG_FILE por um loop que lê o arquivo
e procura o separador de seção [SERVER_...] . Quando encontra um, chama o
função runbackup (exceto para o primeiro). Para as outras linhas, ele faz eval em cada linha, assim como . .
Para garantir que o runbackup seja chamado na última seção, uma seção dummy [END] é adicionada à entrada.
(cat $CONFIG_FILE; echo '[END]') |
while read line
do if [[ "$line" =~ ^\[([A-Z_0-9]+)\] ]]
then if [ -n "$OPTIONS" -a -n "$REMOTE_IP" ]
then echo "section $section"
runbackup
fi
section=${BASH_REMATCH[1]} # captured from =~ regex above
unset OPTIONS REMOTE_IP SOURCE DESTINATION
else eval $line
fi
done