Seu passo para preparar as variáveis é "próximo o suficiente" e funcionará, mas mostra uma fraqueza na compreensão (e é por isso que você postou!)
A designação para DESTINATION precisa ser apenas uma dessas duas:
DESTINATION="/home/hogar/Ubuntu One/folder"
ou
DESTINATION=/home/hogar/Ubuntu\ One/folder
As aspas duplas se transformam em citações (um formulário que possui alguma mágica) e a barra invertida é capaz de citar um único caractere após ele. Pessoalmente, acho que o formulário usando aspas duplas é preferível porque visualmente é melhor.
A propósito, por razões semelhantes, eu faria a atribuição do FILE como:
FILE="${ROOT}bdd.encrypted"
que mostra a ocasião bastante rara de usar ${NAME}
em vez de simplesmente $NAME
- para separar o nome da variável de qualquer letra seguinte. De fato, se você não tivesse um trailing / sobre a definição de ROOT, eu estaria escrevendo
FILE="$ROOT/bdd.encrypted"
que parece ainda melhor. Ele também lhe dará benefícios ocasionais que eu não vou entrar; vamos apenas dizer que, na minha experiência, os traços finais tendem a ser mais indesejados do que bem-vindos, e definitivamente não são necessários. (Isso tem consequências quando se trata de links simbólicos, mas isso é definitivamente muito detalhe nesta resposta já grande).
O ponto crucial do seu problema está realmente ocorrendo no comando mv , que deve ser escrito como
mv "$FILE" "$DESTINATION"
porque hoje em dia, você nunca sabe quando uma variável que representa um caminho terá espaços. Mais uma vez, observe a evitação de chaves para uma simples expansão de variáveis.
A razão pela qual você tem um problema é por causa do processo que o shell usa para construir linhas de comando. Se você ler atentamente o manual do shell, ele basicamente diz que as variáveis (e algumas outras coisas) são expandidas, então ele procura por espaços. Claro que há um pouco mais de complexidade no processo, mas essa é a essência do problema para você.
Mais um ponto relacionado e que vale a pena conhecer: a distinção entre $*
, $@
, "$*"
e "$@"
. Então eu vou falar sobre isso!
Se você tem um script de shell que pode ser chamado como:
foo -x "attached is the software" "please read the accompanying manual"
, em seguida, foo
verá -x
como $1
e as duas strings como $2
e $3
(que você deve acessar como "$2"
e "$3"
por motivos óbvios). Se, no entanto, você quiser passar todo esse conjunto de parâmetros para outro script, o seguinte sofrerá uma divisão horrível em todos os espaços:
bar $*
e o seguinte (que era a única maneira na versão 0.X do Bourn shell original) fará com que todos os argumentos sejam passados como uma única string (também WRONG)
bar "$*"
então a seguinte sintaxe foi adicionada como um caso mágico muito especial:
bar "$@"
que cita deliberadamente os membros individuais de $*
como sequências de texto completas, mas as mantém separadas. Todo mundo é um vencedor agora.
É meio divertido experimentar outros efeitos de $@
quando não usados como "$@"
, mas você descobrirá rapidamente que não é realmente divertido ... é apenas um caso especial que resolve um grande problema.
Todas as shells modernas e decentes que suportam matrizes também usam @ em um caso especial:
${arr[*]}
"${arr[*]}"
"${arr[@]}"
onde o primeiro sofrerá divisão em todos os espaços, levando a um número imprevisível de palavras separadas, o segundo produzirá todos os membros da matriz em uma sequência e o terceiro oferecerá muito bem cada membro da matriz como uma única referência ininterrupta string.
Aproveite!