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
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 unbash
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?
sh
-types shells don ' t utilisez{ ... }
pour les blocs.{...}
est le problème. Il doit y avoir quelque chose qui ne va pas dans la façon dont jai implémenté leif
else
statementif "${string3}" = 'Y'
prend le contenu destring3
comme nom dune commande et lexécute avec deux arguments=
etY
…