Приостановить выполнение и дождаться ввода пользователя

29

У меня есть скрипт, который я делаю, и у меня есть проблема с ним: я хотел бы приостановить выполнение и ждать ввода пользователя. Я думал, что у меня есть это с read -p -n 1 $fooкомандой, но у системы есть проблемы с этой командой. Вот мой текущий сценарий:

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

В функции mainmenu вы можете заметить запись read -n 1 -p «текст идет сюда». Вот где у меня проблема в соответствии с Ubuntu. Может кто-нибудь сказать мне, что идет не так? Благодарность!

Эллиот Лабс, ООО
источник
1
Шебанг не прав. Вы используете функции bash, поэтому shebang должен быть установлен в #!/usr/bin/env bashили #!/bin/bash.
гейра

Ответы:

37

Должно быть:

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

Необходимо поставить nфлаг после того, как это означает, что read выполняется после ввода N символов, не дожидаясь всей строки. Проверьте help readи это для деталей .

NGRhodes
источник
2
Я понял это! Вот правильный код: read -n 1 -p "Input Selection:" "mainmenuinput"теперь он не ждет нажатия клавиши ввода / возврата :-)
Elliot Labs LLC
1
"нелегальный вариант -n"
ses
1
Если вы просто хотите приостановить выполнение и дождаться продолжения цикла for:for $whatever; do $whatever; read -n 1 -p Continue?; done
rekciltnuc
Может кто-нибудь объяснить мне, почему help readработает, так как helpэто не программа ...?
Линд
Очевидно это вещь Баша. Для получения дополнительной информации:help help
Линде