Skip to content

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

read

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

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

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

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

echo $REPLY
# changed: default value

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

Bash
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"

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

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

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

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

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

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

[[Чтение файлов в bash#read]]

pause

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

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

select

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

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

Bash
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