Você deve usar:
mv -f -- "$HOME_DIR/${dir:?}" "$HOME_SAVE/BACKUP/"
A expansão falhará, o script será encerrado e uma mensagem de erro será emitida para stderr se o valor de $dir estiver vazio.
Você pode até especificar a mensagem impressa como:
mv -f -- "$HOME_DIR/${dir:?\$dir is UNSET or NULL!}" "$HOME_SAVE/BACKUP/"
Como alternativa - e menos importante - você pode especificar valores padrão e / ou substitutos para $dir , que só será aplicado se for :- não definido ou nulo ou :+ definido e não nulo usando um formulário semelhante. Todos esses exemplos - acima e abaixo - são representativos de alguns dos vários formulários de expansão de parâmetro padrão especificados pelo POSIX.
No exemplo abaixo, quando $dir é definido e não é nulo, a primeira parte é avaliada para o diretório de origem, senão para nada ea segunda parte é avaliada como seu valor, se houver, mas se não for avaliada como seu destino dir. mv é especificado para falhar quando seus primeiro e segundo argumentos nomeiam o mesmo nome de caminho e, portanto, nada é movido.
mv -f -- "${dir:+$HOME_DIR/}${dir:-$HOME_SAVE/BACKUP/}" "$HOME_SAVE/BACKUP/" 2>/dev/null
Isso provavelmente é um exagero, como suponho:
mv -f -- "$HOME_DIR/$dir" ${dir:+"$HOME_SAVE/BACKUP/"} 2>/dev/null
... deve funcionar também - mv não pode mover nada nowhere . Observe que, em um shell em conformidade com POSIX, as cotas, mesmo dentro dos curlies {} , servem para proteger a expansão porque, nesse caso, não é o valor $dir expandido, mas ${dir:+word} word ' s valor expandido. Colocá-los dentro das chaves serve para avaliar a expansão para nada - nem mesmo uma cadeia nula - quando ${dir} não está definido ou é nulo. Isso provavelmente não importa realmente - estou bastante certo de que um nome de arquivo nulo é inválido em praticamente todos os lugares - mas é como geralmente faço isso. No entanto, isso não é seguro para fazer com ${dir:-"word"} - nesse caso, você obteria a expansão sem numeração de ${dir} ou a expansão entre aspas de word .
Você também pode, opcionalmente, chamar a opção -i nteractive para mv somente se $dir for nulo como:
mv "-i${dir:+f}" -- "$HOME_DIR/$dir" "$HOME_SAVE/BACKUP/" </dev/tty
... e assim você teria a certeza de, pelo menos, não sobrescrever acidentalmente nenhum arquivo em ... / BACKUP sem que alguém primeiro pressione y ( ou o que quer que) no terminal.