Declarações If aninhadas no script Shell

Minhas desculpas se meu problema já foi perguntado em outras postagens, mas não consegui encontrar nenhum. Estou escrevendo um pequeno script de shell que exige que eu escreva uma instrução if aninhada. Não tenho certeza se estou fazendo certo. Não recebo erros, mas o programa não está funcionando como eu esperava. O que eu quero é: se o arquivo já estiver em MasterFile.txt, o usuário tem a opção de obter outro conjunto de dados dizendo y ou Y, ou diga n ou N para encerrar o programa. Problema: o script não termina . Se o arquivo não existir em MasterFile.txt, pegue o conjunto de dados. Este é o código:

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then { echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?" read string3 if "${string3}" = "Y" || "${string3}" = "y"; then { screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit } else{return} fi else{ #opening screen & begin analysis screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit } fi 

Comentários

  • Hum … que shell é esse? sh shells do tipo não ' t use { ... } para blocos.
  • Acredito que seja o bash. O programa funcionou bem com apenas uma instrução if. Não ' acho que {...} seja o problema. Deve haver algo errado com a maneira como implementei o if
  • aninhado Agora recebo um erro que diz que há algo errado com o último else declaração
  • @Kusalananda, bem, você poderia usá-los para agrupamento de comandos lá, bem como em outros lugares …
  • @Ptheguy if "${string3}" = 'Y' pega o conteúdo de string3 como o nome de um comando e o executa com dois argumentos = e Y

Resposta

Uma resposta rápida escreva com uma sintaxe mais convencional:

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?" read string3 if [[ "${string3^}" == "Y" ]]; then screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit else exit 0 fi else #opening screen & begin analysis screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit fi 

Você não parece ter nenhuma função declarada aqui, então return não é válido para este caso de uso. Presumi que uma resposta não afirmativa à sua pergunta orientada se destina a abortar todo o script, portanto, o uso de exit.

A construção ${variable^} forçará o primeiro caractere de $variable, se for uma letra, para maiúscula, o que simplifica a verificação da resposta.

Comentários

  • Portanto, duas coisas: uma, se eu inserir y, ele fecha e, independentemente do que eu inserir, obtenho o seguinte erro ./test/sh: line19: [[variable: command not found
  • certifique-se de que a primeira linha do script seja #!/bin/bash, e não #!/bin/sh. [[ [...] ]] construções são um bash ismo.
  • sim, o cabeçalho está correto
  • E você tem um espaço entre [[ e "${string3^}"?
  • Era isso !! Obrigado mais uma vez. Se você tiver tempo, pode me ensinar o que [[ significa e por que um espaço pode ser tão importante?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *