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
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 umbash
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?
sh
shells do tipo não ' t use{ ... }
para blocos.{...}
seja o problema. Deve haver algo errado com a maneira como implementei oif
else
declaraçãoif "${string3}" = 'Y'
pega o conteúdo destring3
como o nome de um comando e o executa com dois argumentos=
eY
…