Erro de sintaxe no comando if / else

0

O que há de errado com esse comando? Há costuras para ser um erro de sintaxe, mas não vejo onde:

sh -c 'mongodump --host mongo_db --gzip --db db $$(if [ $TYPE = "hour" ]; then echo "--archive=/backup/hour/$$(date +"%H").gz"; elif [ $TYPE = "day" ]; then echo --archive=/backup/day/$$(date +"%d").gz; fi)'

Eu preciso definir o nome do arquivo dependendo da variável TYPE.

  • Se o tipo for "hora", a saída deverá ser, por exemplo, %código%
  • Se o tipo for "dia", a saída deverá ser, por exemplo, %código%
  • Se o tipo for "mês", a saída deverá ser, por exemplo, %código%
por user3142695 27.09.2017 / 19:28

3 respostas

1
sh -c 'echo mongodump --host mongo_db --gzip --db db --archive="$(
    case "$1" in 
        hour)  f="%H";; 
        day)   f="%d";; 
        month) f="%Y-%m";; 
        *)     f="unknown"; set -- "";; 
    esac
    date "+/backup/$1/$f.gz"
)"' x "$TYPE"
  • DRY
  • case é mais legível que long if/elif/elif...
  • O x "$TYPE" é um método para passar a variável "externa" para o corpo sh sem jogar jogos de cotação. O "x" se torna $ 0 no corpo sh, e $ TYPE se torna $ 1.
  • novas linhas são permitidas dentro de $(...)
  • Você pode colocar não- % -diretos na string de formato date .
por 27.09.2017 / 23:47
2

Você tem variáveis não citadas ( $TIME ) e erros de sintaxe ( $$(...) ). Além disso, se TYPE for uma variável de shell (em vez de uma variável de ambiente), seu valor não será visível de forma alguma dentro do único script sh -c citado.

A declaração deve ser parecida com

sh -c "mongodump --host mongo_db --gzip --db db \"$(if [ \"$TYPE\" = \"hour\" ]; then echo \"--archive=/backup/hour/$(date +%H).gz\"; elif [ \"$TYPE\" = \"day\" ]; then echo --archive=/backup/day/$(date +%d).gz; fi)\""

(ou algo assim ...)

É problemático obter a citação correta, já que você gostaria que o shell expandisse $TYPE na subcamada mais interna e ainda tivesse citações duplas.

Se você não precisa do sh -c (não há nada que exija que eu veja), fica um pouco mais fácil para os olhos:

mongodump --host mongo_db --gzip --db db "$(if [ "$TYPE" = "hour" ]; then echo "--archive=/backup/hour/$(date +%H).gz"; elif [ "$TYPE" = "day" ]; then echo "--archive=/backup/day/$(date +%d).gz"; fi)"

No entanto, como isso forneceria uma substituição de comando vazia se $TYPE não for day nem hour , sugiro que você faça isso:

case "$TYPE" in
    hour) archive="/backup/hour/$(date +%H).gz" ;;
    day)  archive="/backup/day/$(date +%d).gz"  ;;
    *)
       printf 'Error: Unknown TYPE "%s"\n' "$TYPE" >&2
       exit 1 ;;
esac

sh -c "mongodump --host mongo_db --gzip --db db --archive=$archive"

# or just

mongodump --host mongo_db --gzip --db db --archive="$archive"

Isso torna muito mais fácil ler, entender e manter.

    
por 27.09.2017 / 21:11
0

Se TYPE não estiver definido, vazio ou consistir inteiramente em espaço em branco, sua instrução se resume a if [ = "hour" ] , que é um erro de sintaxe.

Como você está usando sh , a solução alternativa para isso é um prefixo: if [ "x$TYPE" = "xhour" ]

Você não pode simplesmente usar aspas fracas, porque "" também será resolvido para if [ = "hour" ] ; pelo menos com sh . bash ao usar a sintaxe de chave dupla mais robusta (por exemplo, if [[ "$TYPE" = "hour" ]] ) fará a coisa certa sem recorrer a prefixos ou sufixos.

    
por 27.09.2017 / 19:44