Resposta curta: veja BashFAQ # 50 .
Resposta longa: Colocar comandos (ou partes de comandos) em variáveis e depois recuperá-las intactas é complicado. Quando o shell expande uma variável na linha de comando, se a variável estiver entre aspas duplas, ela não será analisada (consulte a resposta do @Dennis Williamson); se não estiver entre aspas, os espaços serão analisados como quebras de argumentos, mas aspas e escape não serão analisadas (e é por isso que você recebeu um erro sobre uma aspa literal em um dos argumentos para rsync). Em ambos os casos, colocar aspas no valor da variável não faz nada útil.
Existem, no entanto, várias maneiras de corrigir seu script, dependendo de quão complexo é o OPTS:
-
Se --rsh é a única coisa no OPTS, então cite duas vezes (como na resposta de Dennis Williamson):
OPTS='--rsh=ssh -p2222' rsync "$OPTS" "$BACKDIR" "$USER@$DEST:$DESTDIR"
(Observe também as aspas duplas em torno dos outros argumentos: isso é para evitar erros de interpretação se eles contiverem espaços e geralmente é uma boa higiene de script).
-
Se o conteúdo de OPTS é constante (ou pelo menos, a parte --rsh é), então não tente colocá-lo em uma variável, apenas use diretamente:
rsync --rsh='ssh -p2222' $RESTOFOPTS "$BACKDIR" "$USER@$DEST:$DESTDIR"
-
Se nenhum desses casos simples se aplicar, use uma matriz em vez de uma variável simples:
OPTS=(-x --delete --inplace) if [[ "$rsync_version" == 2.* ]]; then OPTS+=(-aE) else OPTS+=(-aNHX) fi if [[ -n "$using_rsh" ]]; then OPTS+=('--rsh=ssh -p2222') fi rsync "${OPTS[@]}" "$BACKDIR" "$USER@$DEST:$DESTDIR"