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.