Suspendre l'exécution et attendre l'entrée utilisateur

29

J'ai un script que je crée et j'ai un problème avec lui: je voudrais suspendre l'exécution et attendre la saisie de l'utilisateur. Je pensais l'avoir avec la read -p -n 1 $foocommande, mais le système a des problèmes avec cette commande. Voici mon script actuel:

#!/bin/sh

# Ititialization

mainmenu () {
  echo "Press 1 to update your system"
  echo "Press 2 to install samba"
  echo "Press 3 to install vsFTPd"
  echo "Press 4 to install the current version of Webmin"
  echo "Press 5 to configure samba for Active Directory"
  echo "Press x to exit the script"
  read -n 1 -p "Input Selection:" mainmenuinput
  if [ "$mainmenuinput" = "1" ]; then
            updatesystem
        elif [ "$mainmenuinput" = "2" ]; then
            installsamba
        elif [ "$mainmenuinput" = "3" ]; then
            installvsftpd
        elif [ "$mainmenuinput" = "4" ]; then
            installwebmin
        elif [ "$mainmenuinput" = "5" ]; then
            configuresambaforactivedirectory
        elif [ "$mainmenuinput" = "x" ];then
            quitprogram
        elif [ "$mainmenuinput" = "X" ];then
            quitprogram
        else
            echo "You have entered an invallid selection!"
            echo "Please try again!"
            echo ""
            echo "Press any key to continue..."
            read -n 1
            clear
            mainmenu
        fi
}

# This builds the main menu and routs the user to the function selected.

mainmenu

# This executes the main menu function.
# Let the fun begin!!!! WOOT WOOT!!!!

Vous pouvez remarquer dans la fonction mainmenu l'entrée read -n 1 -p "text goes here". C'est là que je rencontre le problème selon ubuntu. Quelqu'un peut-il me dire ce qui ne va pas? Merci!

Elliot Labs LLC
la source
1
Le shebang est faux. Vous utilisez les fonctionnalités bash, le shebang doit donc être défini sur #!/usr/bin/env bashou #!/bin/bash.
geirha

Réponses:

37

Devrait être:

read  -n 1 -p "Input Selection:" mainmenuinput

Besoin de mettre le ndrapeau après, car cela indique à lecture de s'exécuter après la saisie de N caractères, n'attendez pas une ligne entière. Vérifiez help readet cela pour plus de détails .

NGRhodes
la source
2
Je l'ai compris! Voici le code correct: read -n 1 -p "Input Selection:" "mainmenuinput"Il n'attend plus la pression de la touche entrée / retour :-)
Elliot Labs LLC
1
"option illégale -n"
ses
1
Si vous voulez simplement suspendre l'exécution et attendre de continuer dans une boucle for:for $whatever; do $whatever; read -n 1 -p Continue?; done
rekciltnuc
Quelqu'un peut-il m'expliquer pourquoi ça help readmarche, puisque ce helpn'est pas un programme ...?
lindhe
Apparemment, c'est une chose Bash. Pour plus d'informations:help help
lindhe