O shell analisa aspas antes de substituir as variáveis, portanto, incluir cotações no valor da variável não faz o que você espera (e o echo
é altamente enganoso porque não mostra essa distinção). O que você deve fazer é usar aspas sem escape ao definir a matriz (então elas são analisadas como delimitadores em torno dos elementos da matriz, em vez de parte do valor da matriz), em seguida, aspas duplas na referência à matriz (para que não seja dividir ou curinga - expandir os valores na matriz). Eu também substitui o comando echo
por um printf
que mostra o que acontecerá com mais precisão:
rsync_cmd=(${check_flags} -rWltpgoDvdHP --delete-before -- "${backup_dir}" "admin@nas-1:${backup_basename}/")
printf "%q " CMD to run: rsync "${rsync_cmd[@]}"
printf "\n"
rsync "${rsync_cmd[@]}"
Note que printf
pode não mostrar o que você espera - ele irá imprimir uma representação equivalente do comando que será executado, mas existem muitas representações equivalentes diferentes de cada argumento e escolherá um baseado em suas preferências, e não em como foi inserido originalmente. BTW, você também pode usar set -x
para depurar coisas como esta, mas (como em printf "%q "
) ele pode usar uma representação diferente da esperada.