Detectar se uma variável está vazia

6

No meu script Bash, tenho esta linha:

 mv -f $HOME_DIR/$dir $HOME_SAVE/BACKUP

O problema é quando $dir está vazio (nenhum diretório $dir ) o comando mv moveu o diretório $HOME_DIR . Queremos apenas mover os diretórios $dir .

Como posso evitar este caso?

Eu posso usar isso:

ls $HOME_DIR | wc -l   
# and verify if the number is -gt 1

Mas esta não é uma solução elegante.

    
por maihabunash 04.12.2014 / 12:52

4 respostas

8

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.

    
por 04.12.2014 / 13:01
5

POSIXly:

[ -n "$dir" ] && mv -f -- "$HOME_DIR/$dir" "$HOME_SAVE/BACKUP"

ou:

[ -d "${dir:+$HOME_DIR/$dir}" ] && ...
    
por 04.12.2014 / 13:00
3

Teste se a variável dir está vazia ( [[ -z $dir ]] ):

[[ -z $dir ]] || mv -t "$HOME_SAVE/BACKUP" "$HOME_DIR/$dir"
    
por 04.12.2014 / 12:58
3

Você pode usar isto:

mv -f -- "$HOME_DIR/./$dir" "$HOME_SAVE/BACKUP/"

Se $dir estiver vazio, isso dará um erro "Dispositivo ou ocupado".

No entanto, isso é um truque.

    
por 04.12.2014 / 13:26