2009-11-11 9 views
3

Je ne sais pas quelle est la politique ici en posant des questions de suivi. Alors s'il vous plaît excusez-moi si je casse le protocole. Plus tôt, je construisais un menu en bash (Here)Menu Bash Case - choix dynamiques

Et jusqu'à présent, je l'ai vraiment très bien fonctionner. Code ici.

while [[ 1 ]] 
do 
    cat -n "$dumpfile" 
    read -p "Please make a selection, select q to quit: " choice 
    case $choice in 
      # Check for digits 
    [0-9]) dtvariable=$(sed -n "$choice"p "$dumpfile") 
       $dtvariable   ;; 
    q|Q) 
     break 
      ;; 
     *) 
      echo "Invalid choice" 
      ;; 
    esac 
done 

Sauf - qui fonctionne très bien pour les éléments du menu jusqu'à 9. Le menu sera dynamique - pourrait avoir 1 pièce, 20 articles ou 197 articles. J'ai essayé de changer [0-9] pour être [0-9] [0-9] pour voir si cela prendrait 12. Mais ce n'est pas le cas. Quelqu'un peut-il me mettre sur le bon chemin? Je suppose que je pourrais juste enlever la partie [0-9] et prendre tout ce qui n'est pas q. Mais ne serait-il pas préférable de chercher des chiffres?

Merci d'avance.

Répondre

2

je voudrais faire une validation $choice:

case $choice in 
    # Check for digits 
    +([0-9])) 
     lines=($(wc -l)) 
     if ((choice > 0 && choice <= lines)) 
     then 
      dtvariable=$(sed -n "$choice"p "$dumpfile") 
      $dtvariable   ;; 
     fi 
# etc. 
+1

Merci Dennis. Je suis allé sans la partie extglob - et il teste fantastiquement. – Chasester

1

Voici ce que j'ai commencé à travailler. Les principales différences sont l'ajout de shopt -s extglob, qui tourne sur la recherche de motifs étendu, et le motif +([0-9]), qui est le bash équivalent d'expression régulière [0-9]+

shopt -s extglob 
while [[ 1 ]] 
do 
    read -p "Please make a selection, select q to quit: " choice 
    case $choice in 
      # Check for digits 
    +([0-9])) 
     echo $choice ;; 
    q|Q) 
     break 
      ;; 
     *) 
      echo "Invalid choice" 
      ;; 
    esac 
done 
+0

Merci, c'est de lancer une erreur de syntaxe près du jeton inattendu '('erreur juste par le + ([0-9])) Je ne peux pas voir d'espaces supplémentaires ou quoi que ce soit d'autre. toujours à la recherche. – Chasester

+0

avez-vous veillé à ajouter l'extglob? Cela ne marchera pas sans cela, puisque la syntaxe + (...) est activée par extglob. –