2009-11-02 4 views
0

J'ai un script bash qui écrit dans un fichier. à la fin du script je veux afficher un menu, avec des numéros de ligne - et permettre à l'utilisateur de sélectionner 1 ou 2, (etc. jusqu'au nombre de lignes dans le fichier) puis l'exécuter.Menu Bash: Retour au menu après la sélection effectuée et exécutée?

Jusqu'à ici est parfait.

Cependant, après que la ligne soit exécutée (disons par exemple qu'elle affiche un autre fichier). Je voudrais revenir au menu et laisser l'utilisateur sélectionner un autre numéro. Y compris zéro pour quitter le menu.

Une fois le menu affiché, voici ce qui suit. (Dumpline étant la ligne du fichier lu)

 dresult=`sed -n "$dumpline"p "$PWD"/"$myday1"_"$myjob".txt` 
    $dresult 

Mais en ce moment - après l'exécution de la variable dresult de $ - il sort de la coquille (où au lieu que je voudrais que le menu affiché

Toutes les pensées.?

vous remercie à l'avance

+0

Avez-vous une boucle autour de la construction de menu, de sorte qu'une fois la première action est terminée, la le menu est affiché à nouveau? Pourriez-vous poster cela? –

+0

Je ne sais pas encore. il affiche simplement les lignes du fichier. Mais je pensais juste à définir des fonctions pour faire le travail. – Chasester

Répondre

0

Je pense, vous avez besoin quelque chose comme une boucle est ici un petit skelleton pour exécuter une ligne sélectionnée à partir du fichier:..

#!/bin/bash 

dumpfile="bla.txt" 

echo "ls 
echo 'hello'" > ${dumpfile} 

function do_action { 
    line="$(sed -n "${1},1p" "$dumpfile")" 
    (
     eval "${line}" 
    ) 
} 

cat -n $dumpfile 
nr=$(cat "${dumpfile}" | wc -l) 
PS3="select line nr or nr for QUIT: " 
select ACTION in $(seq "$nr") QUIT 
do 
    case $ACTION in 
     QUIT) echo "exit" ; break ;; #EXIT 
     *) do_action "$ACTION" ;; 
    esac 
done 

Mais soyez conscient des éléments suivants:

  • En utilisant eval peut-être pas AllWays être une bonne idée (fuite est difficile). Parfois, $ line devrait suffire.
  • L'utilisation d'un sous-shell empêche le changement de variables en exécutant une ligne du fichier. Il empêche également de quitter le script à partir de lignes qui normalement sortent d'un shell.
+0

fonctionne très bien! Merci beaucoup. – Chasester

1

Mes commentaires sur dz de réponse sont trop longs pour un commentaire, donc je les afficher ici:

En utilisant seq avec select ferait un menu à la recherche redondante, sans corrélation entre et l'affichage des lignes $dumpfile:

ls 
echo 'hello' 

1) 1 
2) 2 
etc. 

Vous pouvez faire quelque chose comme ceci:

saveIFS=$IFS 
IFS=$'\n' 
menu=$(< $dumpfile) 
PS3="Make a selection: " 
select ACTION in $menu QUIT 
do 
    IFS=$saveIFS 
    case ... 
+0

merci, laissez-moi tenter votre chance.J'étais juste en train de le prêcher – Chasester

+0

+1 pour ce joli tour. Je pense aussi à intégrer les lignes dans le "in" saté, mais comme dans le builtin, vous avez des problèmes avec whitepaces. Mais changer IFS fait l'affaire. –

+0

semble fonctionner bien Dennis. Je viens de supprimer la ligne = partie. Un Q cependant - comment est-ce que je pourrais l'avoir retourner au menu après que l'élément de menu ait été affiché? – Chasester

2

Voici une autre façon de faire un menu qui repose sur cat ayant la possibilité de numéroter les lignes d'un fichier (certaines versions de cat ne peuvent pas avoir cela - voir le second exemple si c'est le cas). Ces deux exemples sont pour un menu simple à quatre article:

while [[ 1 ]] 
do 
    cat -n menufile 
    read -p "Make a selection " choice 
    case $choice in 
     1|2) 
      echo "A or B" 
      ;; 
     3) 
      echo "C" 
      ;; 
     4) 
      break 
      ;; 
     *) 
      echo "Invalid choice" 
      ;; 
    esac 
done 

Cela ne nécessite pas cat -n:

saveIFS="$IFS" 
IFS=$'\n' 
read -d '' -a menuarray < menufile 
IFS="$saveIFS" 

for ((i=0; i<${#menuarray[@]}; i++)) 
do 
    menu=$menu"$(($i+1))) ${menuarray[i]}"$'\n' 
done 

while [[ 1 ]] 
do 
    echo "$menu" 
    read -p "Make a selection " choice 
    case $choice in 
     1|2) 
      echo "A or B" 
      ;; 
     3) 
      echo "C" 
      ;; 
     4) 
      break 
      ;; 
     *) 
      echo "Invalid choice" 
      ;; 
    esac 
done 
+0

Merci Dennis. Je ne peux pas y accéder quand je ne suis pas au travail. mais je vais faire un tourbillon quand je reviendrai là-bas. Merci beaucoup. – Chasester