read

read читает строку из stdin или файлового дескриптора, записывает слова в список переменных или в переменную-массив (список).

Useful keys

KeyExplain
-pвыводит приглашение к вводу
-iуказание значения по умолчанию
-eпозволяет юзать возможности библиотеки Readline. Например, навигация по строке клавишами со стрелками для редактирования значения по умолчанию перед его подтверждением
-sпозволяет запрашивать пароли без отображения вводимых символов на экране

Использование редактируемого значения по умолчанию:

read -ei 'default value' -p 'Enter something: '
# Enter something: changed: default value
 
echo $REPLY
# changed: default value

Пример запроса ввода пароля:

read -sp 'Enter the secret password: ' ; \
  echo -e "\n\n, the password is: ~$REPLY~"
 
# Enter the secret password:
# the password is: ~super secret~

Реализация "Press any key to continue" в bash

Была старая команда pause в DOS/Windows. В bash можно сымитировать ее так.

read -n1 -p 'CTRL-C to abort or any other key to continue...'

Иногда может понадобиться явно указывать откуда читать клавиши. Например, в некоторых случаях + в конструкции while > if может не срабатывать read, поэтому нужно настроить явное чтение клавиш с терминала с помощью /dev/tty:

read -rsn1 -p '' < /dev/tty

Поддержка тайм-аута отлично подходит для запроса ввода дополнительных данных, позволяя не «подвесить» сценарий, если пользователю нечего ввести.

Запрос ввода с таймаутом:

time read -t 4 -p "Are you there?"
# Are you there?
# real 0m4.000s
# user 0m0.000s
# sys 0m0.000s

read

select

Команда select создает простое меню и позволяет сделать выбор. Можно еще добавить в меню пункты для выхода или отмены.
Похожий инструмент с возможностями побольше - dialog (но это не идиома bash).

Пример создания меню из ~/.ssh/config для выбора целевого хоста ssh_target и подключения к нему:

PS3='SSH to> '
select ssh_target in Exit \
  $(egrep -i '^Host \w+' "$ssh_config" | cut -d' ' -f2-); do
	case $REPLY in
		1|q|x|quit|exit) exit 0 ;;
		*) break ;;
	esac
done
 
# Вывод выбранного пункта меню
echo ssh $ssh_target
 
# Результат:
$ select-ssh.sh
1) Exit                  3) gitlab.com 5) mythtv-be01
2) git.atlas.oreilly.com 4) github.com 6) kitchen
SSH to> 1
$ select-ssh.sh
1) Exit                  3) gitlab.com 5) mythtv-be01
2) git.atlas.oreilly.com 4) github.com 6) kitchen
SSH to> 6
ssh kitchen

Соус: Книга Идиомы Bash Глава 10. Помимо идиом: работа с bash Получение ввода пользователя