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

Вот пример:

#!/bin/bash
echo -e "Enter IP address: \c"
read
echo $REPLY

Но я хочу, чтобы пользователю было проще ответить. Я хотел бы предложить ответ пользователю. Это должно выглядеть примерно так:

Введите свой IP: 192.168.0.4

И пользователь может просто нажать Enter и согласиться с 192.168.0.4, или может удалить некоторые символы (например, удалить «4» с одним пробелом и вместо этого ввести 3).

Как сделать такой ввод? Можно в баш?


person Larry Cinnabar    schedule 18.12.2010    source источник


Ответы (4)


bash read имеет поддержку readline (Редактировать: Джонатан Леффлер также предлагает поместить подсказку в read)

#!/bin/bash
read -p "Enter IP address: " -e -i 192.168.0.4 IP
echo $IP
person Martin v. Löwis    schedule 18.12.2010
comment
Почему бы не пойти на все и не использовать: read -p "Enter IP address: " -i 192.168.0.4 -e IP? - person Jonathan Leffler; 18.12.2010
comment
Полезно знать о -i. Возможно, вы также захотите абстрагировать IP-адрес по умолчанию в переменную. - person SiegeX; 18.12.2010
comment
Полезно знать о сочетании -e с -i для предварительного заполнения буфера ответа, но обратите внимание, что -i требует Bash 4.0 или выше (пользователям OSX с OSX 10.10, использующим стандартную версию Bash, bash 3.2.57, не повезло). - person mklement0; 15.06.2015

Я бы сделал это так, чтобы предложить значение по умолчанию в подсказке в скобках, а затем использовать расширение параметра значение по умолчанию, чтобы установить IP на 192.168.0.4, если они только что нажали ввод, иначе оно будет иметь значение они вошли.

#!/bin/bash
default=192.168.0.4
read -p "Enter IP address [$default]: " IP
IP=${IP:-$default}
echo "IP is $IP"

Выход

$ ./defip.sh
Enter IP address [192.168.0.4]:
IP is 192.168.0.4

$ ./defip.sh
Enter IP address [192.168.0.4]: 192.168.1.1
IP is 192.168.1.1
person SiegeX    schedule 18.12.2010
comment
Красиво сделано; это следующая лучшая вещь после -e -i, если ваша версия Bash ‹ 4. Я предлагаю использовать другое имя переменной в вашем примере, потому что REPLY имеет особое значение: оно устанавливается Bash, если вы не указываете имя переменной ответа, и ее значение устанавливается равным введенному необработанному значению, включая любые пробелы. - person mklement0; 15.06.2015
comment
Для меня это намного чище, чем -e -i, так как он очищает ввод с экрана. - person vesperto; 25.06.2019

Классический способ сделать большую часть того, что вы хотите, это:

default="192.168.0.4"
echo -e "Enter IP address ($default): \c"
read reply
[ -z "$reply" ] && reply=$default
echo "Using: $reply"

Это не дает возможности редактирования.

person Jonathan Leffler    schedule 18.12.2010
comment
Хе, джинкс. Хороший призыв к абстрагированию IP-адреса по умолчанию. - person SiegeX; 18.12.2010

Редактировать непрактично, но обычно делают что-то вроде:

echo -e "Enter IP address [$default]: \c"
read answer
if [ "$answer" = "" ]; then
     answer="$default"
fi
person Ben Jackson    schedule 18.12.2010
comment
Да. эти способы хороши, но без редактирования :'(\n \n Почему мне полезно редактирование:\n У меня большой вопросник. Может случиться так, что пользователь допустил какие-то ошибки и хочет проверить свои ответы. Чем все вопросы переспросил пользователя, но последний ответ на каждый вопрос предлагается автоматически.Я пользователь сделал небольшую ошибку (например, в последних символах) - он может быстро отредактировать его - person Larry Cinnabar; 19.12.2010