Declaraciones If anidadas en el script Shell

Mis disculpas si mi problema ya se ha planteado en otras publicaciones, pero no pude encontrar ninguna. Estoy escribiendo un pequeño script de shell que requiere que escriba una declaración if anidada. No estoy realmente seguro de hacerlo bien. No obtengo errores, pero el programa no funciona como lo esperaba. Lo que quiero es: si el archivo ya está en MasterFile.txt, el usuario tiene la opción de tomar otro conjunto de datos diciendo y o Y, o di n o N para terminar el programa. Problema: la secuencia de comandos no finaliza . Si el archivo no existe en MasterFile.txt, tome el conjunto de datos. Aquí está el 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 

Comentarios

  • Um … ¿qué shell es este? sh -tipo shells no ' t usan { ... } para bloques.
  • Creo que es bash. El programa funcionó bien con solo una instrucción if. No ' no creo que {...} sea el problema. Debe haber algo mal con la forma en que implementé el if
  • anidado Ahora aparece un error que dice que hay algo mal con el último else declaración
  • @Kusalananda, bueno, podrías usarlos para agrupar comandos allí y en otros lugares …
  • @Ptheguy if "${string3}" = 'Y' toma el contenido de string3 como el nombre de un comando y lo ejecuta con dos argumentos = y Y

Responder

Una respuesta rápida escriba con una sintaxis más 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 

No parece tener ninguna función declarada aquí, así que return no es válido para este caso de uso. Supuse que una respuesta no afirmativa a la pregunta solicitada tiene como objetivo abortar todo el script, de ahí el uso de exit.

La construcción ${variable^} forzará el primer carácter de $variable, si es una letra, a ser mayúscula, lo que simplifica la verificación de respuesta.

Comentarios

  • Entonces, dos cosas: una, si ingreso y, se cierra y, independientemente de lo que ingrese, obtengo el siguiente error ./test/sh: line19: [[variable: command not found
  • asegúrese de que la primera línea del script sea #!/bin/bash, y no #!/bin/sh. [[ [...] ]] construcciones son un bash ismo.
  • sí, el encabezado es correcto
  • Y tiene un espacio entre [[ y "${string3^}"?
  • ¡¡Eso fue !! Gracias una vez más. Si tiene tiempo, ¿le importaría enseñarme qué significa [[ y por qué un espacio puede ser tan importante?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *