Wstrzymaj wykonanie i poczekaj na dane wejściowe użytkownika

29

Mam skrypt, który tworzę i mam z nim problem: chciałbym wstrzymać wykonanie i czekać na dane wejściowe użytkownika. Myślałem, że mam to z read -p -n 1 $foopoleceniem, ale system ma problemy z tym poleceniem. Oto mój obecny skrypt:

#!/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!!!!

W funkcji menu głównego można zauważyć, że wpis -n 1 -p „tekst idzie tutaj”. Właśnie tam mam problem według Ubuntu. Czy ktoś może mi powiedzieć, co się dzieje? dzięki!

Elliot Labs LLC
źródło
1
Shebang jest zły. Używasz funkcji bash, więc shebang musi być ustawiony na #!/usr/bin/env bashlub #!/bin/bash.
geirha

Odpowiedzi:

37

Powinno być:

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

Musisz wstawić nflagę później, ponieważ oznacza to, że należy przeczytać, aby wykonać po wprowadzeniu N znaków, nie czekaj na całą linię. Sprawdź help readi to po szczegóły .

NGRhodes
źródło
2
Zrozumiałem! Oto poprawny kod: read -n 1 -p "Input Selection:" "mainmenuinput"Teraz nie czeka na naciśnięcie klawisza Enter / Return :-)
Elliot Labs LLC
1
„nielegalna opcja -n”
ses
1
Jeśli chcesz tylko wstrzymać wykonywanie i poczekać, aby kontynuować w pętli for:for $whatever; do $whatever; read -n 1 -p Continue?; done
rekciltnuc
Czy ktoś może mi wyjaśnić, dlaczego help readdziała, skoro helpnie jest programem ...?
Lindhe
Najwyraźniej to sprawa Bash. Więcej informacji:help help
Lindhe