Shell Script: Чтение ввода на той же строке после вывода сообщения
Я столкнулся с проблемой в моем shell-скрипте. Вот код, который я выполняю:
#!/bin/sh
echo "Введите [y/n] : "
read opt
В результате выполнения я вижу следующий вывод:
Введите [y/n] :
Y
Мне нужно, чтобы ввод значения отображался на той же строке, чтобы результат выглядел так:
Введите [y/n] : Y
Думаю, это должно быть просто, но я новичок в bash-скриптах. Как мне это исправить?
4 ответ(ов)
Решение: read -p "Введите [y/n] : " opt
Из инструкции help read
:
-p prompt выводит строку PROMPT без завершающего символа новой строки перед попыткой считывания
Таким образом, использование опции -p
в команде read
позволяет задать подсказку для пользователя, которая будет выведена на экран, прежде чем программа начнет считывать его ввод.
Шебанг #!/bin/sh
означает, что вы пишете код для исторической оболочки Bourne (которая все еще может встречаться на некоторых системах, например, на Solaris), или, скорее всего, для стандартного языка оболочки, определенного POSIX. Это означает, что конструкции read -p
и echo -n
могут быть ненадежными.
Стандартным и переносимым решением является использование следующего кода:
printf 'Введите [y/n] : '
read -r opt
Параметр -r
предотвращает специальную обработку символа \
, так как по умолчанию read
интерпретирует его как знак продолжения строки, если он находится в конце строки.
Если вы знаете, что ваш скрипт будет выполняться на системах с Bash, вы можете изменить шебанг на #!/bin/bash
(или #!/usr/bin/env bash
) и использовать все современные функции Bash. (На многих системах /bin/sh
— это символическая ссылка на bash
, так что это сработает в любом случае, но полагаться на это — плохая практика, и bash
на самом деле отключает некоторые свои функции, когда запускается под именем sh
.)
Чтобы выполнить ввод с提示ом и без новой строки в Bash, можно использовать команду read
следующим образом:
- Используя
echo -n
иread
:
echo -n "Введите [y/n]: " ; read opt
Эта команда сначала выводит сообщение "Введите [y/n]: " без перехода на новую строку, а затем read
ожидает ввода пользователя и сохраняет его в переменную opt
.
- Используя параметр
-p
у командыread
:
read -p "[y/n]: " opt
Эта команда более лаконична. Она отображает приглашение "[y/n]: " и ждет ввода от пользователя, сохраняя результат в переменной opt
.
Оба метода корректны, однако второй способ с -p
является более предпочтительным из-за своей простоты и читаемости.
Для того чтобы избежать добавления символа новой строки в конце вывода команды echo
, вы можете использовать флаг -n
в следующем примере:
echo -n "Введите [y/n]: "
read opt
В этом коде команда echo -n
выводит строку "Введите [y/n]: " без переноса на новую строку, что позволяет пользователю сразу вводить свой ответ после этого сообщения. Таким образом, ввод будет располагаться непосредственно после提示, делая интерфейс более аккуратным.
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Как использовать 'grep' для непрерывного потока?
Прерывание скрипта оболочки при возвращении любой команды ненулевого значения
Как убить процесс по имени вместо PID в Linux?
Как передавать параметры в Bash-скрипт?