Instructions If imbriquées dans le script Shell

Je mexcuse si mon problème a déjà été posé dans dautres messages, mais je nai pas pu en trouver. Jécris un petit script shell qui moblige à écrire une instruction if imbriquée. Je ne suis pas vraiment sûr de le faire correctement. Je nobtiens aucune erreur, mais le programme ne fonctionne pas comme je my attendais. Ce que je veux, cest: si le fichier est déjà dans MasterFile.txt, alors lutilisateur a la possibilité de prendre un autre ensemble de données en disant y ou Y, ou dites n ou N pour terminer le programme. Problème: le script ne se termine pas . Si le fichier nexiste pas dans MasterFile.txt, prenez lensemble de données. Voici le code:

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 

Commentaires

  • Euh … quel shell est-ce? sh -types shells don ' t utilisez { ... } pour les blocs.
  • Je crois que cest bash. Le programme fonctionnait très bien avec une seule instruction if. Je ne ' je pense que {...} est le problème. Il doit y avoir quelque chose qui ne va pas dans la façon dont jai implémenté le if
  • imbriqué. Maintenant, jobtiens une erreur indiquant quil y a un problème avec le dernier else statement
  • @Kusalananda, eh bien, vous pouvez les utiliser pour le regroupement de commandes là-bas comme ailleurs …
  • @Ptheguy if "${string3}" = 'Y' prend le contenu de string3 comme nom dune commande et lexécute avec deux arguments = et Y

Réponse

Une réponse rapide écrivez avec une syntaxe plus conventionnelle:

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 

Vous ne semblez pas avoir de fonctions déclarées ici, donc return nest pas valide pour ce cas dutilisation. Jai supposé quune réponse non affirmative à votre question demandée était censée annuler le script entier, doù lutilisation de exit.

La construction ${variable^} forcera le premier caractère de $variable, sil sagit dune lettre, à être en majuscules, ce qui simplifie la vérification des réponses.

Commentaires

  • Donc deux choses: une si jentre y ça se ferme, et peu importe ce que jentre, jobtiens le erreur suivante ./test/sh: line19: [[variable: command not found
  • assurez-vous que la première ligne du script est #!/bin/bash et non #!/bin/sh. [[ [...] ]] les constructions sont un bash ism.
  • oui, len-tête est correct
  • Et vous avez un espace entre [[ et "${string3^}"?
  • Cétait tout !! Merci encore une fois. Si vous avez le temps, voulez-vous mapprendre ce que signifie [[ et pourquoi un espace peut être si important?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *