Получение ввода юзера в bash

read

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

Самые полезные ключи (-eip):

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

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

read -ei 'default value' -p 'Enter something: '
# Получение ввода юзера в bash
# Enter something: changed: default value
 
echo $REPLY
# changed: default value

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

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

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

В скриптах на скорую руку (нет ничего более постоянного, чем “временное”) можно такую штуку сделать:

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

pause

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

read -n1 -p 'Press any key to continue...'
# Press any key to continue...

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
 
# Результат:
$ examples/ch10/select-ssh.sh
1) Exit                  3) gitlab.com 5) mythtv-be01
2) git.atlas.oreilly.com 4) github.com 6) kitchen
SSH to> 1
$ examples/ch10/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Получение ввода пользователя

bash