Прочитайте переменную в bash со значением по умолчанию
Мне нужно прочитать значение из терминала в bash script. Я хотел бы иметь возможность указать значение по умолчанию, которое пользователь может изменить.
# Please enter your name: Ricardo^
В этом script появится приглашение: "Пожалуйста, введите свое имя:" значением по умолчанию является "Ricardo", а курсор будет после значения по умолчанию. Есть ли способ сделать это в bash script?
Ответы
Ответ 1
Вы можете использовать расширение параметров, например
read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name
Включение значения по умолчанию в подсказку между скобками является довольно распространенным соглашением
Ответ 2
read -e -p "Enter Your Name:" -i "Ricardo" NAME
echo $NAME
Ответ 3
В Bash 4:
name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"
Отображает имя после приглашения следующего вида:
Please enter your name: Ricardo
с курсором в конце имени и позволяет пользователю редактировать его. Последняя строка является необязательной и заставляет имя быть исходным по умолчанию, если пользователь стирает ввод или по умолчанию (отправляет нуль).
Ответ 4
код:
IN_PATH_DEFAULT="/tmp/input.txt"
read -p "Please enter IN_PATH [$IN_PATH_DEFAULT]: " IN_PATH
IN_PATH="${IN_PATH:-$IN_PATH_DEFAULT}"
OUT_PATH_DEFAULT="/tmp/output.txt"
read -p "Please enter OUT_PATH [$OUT_PATH_DEFAULT]: " OUT_PATH
OUT_PATH="${OUT_PATH:-$OUT_PATH_DEFAULT}"
echo "Input: $IN_PATH Output: $OUT_PATH"
Пример прогона:
Please enter IN_PATH [/tmp/input.txt]:
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt
Ответ 5
Я нашел этот вопрос, ища способ представить что-то вроде:
Something interesting happened. Proceed [Y/n/q]:
Используя приведенные выше примеры, я сделал следующее: -
echo -n "Something interesting happened. "
DEFAULT="y"
read -e -p "Proceed [Y/n/q]:" PROCEED
# adopt the default, if 'enter' given
PROCEED="${PROCEED:-${DEFAULT}}"
# change to lower case to simplify following if
PROCEED="${PROCEED,,}"
# condition for specific letter
if [ "${PROCEED}" == "q" ] ; then
echo "Quitting"
exit
# condition for non specific letter (ie anything other than q/y)
# if you want to have the active 'y' code in the last section
elif [ "${PROCEED}" != "y" ] ; then
echo "Not Proceeding"
else
echo "Proceeding"
# do proceeding code in here
fi
Надежда, которая помогает кому-то не думать о логике, если они сталкиваются с той же проблемой
Ответ 6
Я только что использовал этот шаблон, который я предпочитаю:
read name || name='(nobody)'
Ответ 7
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname
Установите значение по умолчанию; распечатать его; читать новое значение; если есть новое значение, используйте его вместо значения по умолчанию. Существуют (или были) некоторые различия между оболочками и системами о том, как подавить новую строку в конце подсказки. Нотация '\ c', похоже, работает на MacOS X 10.6.3 с 3.x bash и работает на большинстве вариантов Unix, полученных из System V, используя оболочки Bourne или Korn.
Также обратите внимание, что пользователь, вероятно, не поймет, что происходит за кулисами; их новые данные будут введены после имени уже на экране. Возможно, было бы лучше отформатировать его:
echo "Please enter your name ($name): \c"
Ответ 8
#Script for calculating various values in MB
echo "Please enter some input: "
read input_variable
echo $input_variable | awk '{ foo = $1 / 1024 / 1024 ; print foo "MB" }'
Ответ 9
Параметр -e и -t не работает вместе. Я попробовал некоторые выражения, и результатом был следующий фрагмент кода:
QMESSAGE="SHOULD I DO YES OR NO"
YMESSAGE="I DO"
NMESSAGE="I DO NOT"
FMESSAGE="PLEASE ENTER Y or N"
COUNTDOWN=2
DEFAULTVALUE=n
#----------------------------------------------------------------#
function REQUEST ()
{
read -n1 -t$COUNTDOWN -p "$QMESSAGE ? Y/N " INPUT
INPUT=${INPUT:-$DEFAULTVALUE}
if [ "$INPUT" = "y" -o "$INPUT" = "Y" ] ;then
echo -e "\n$YMESSAGE\n"
#COMMANDEXECUTION
elif [ "$INPUT" = "n" -o "$INPUT" = "N" ] ;then
echo -e "\n$NMESSAGE\n"
#COMMANDEXECUTION
else
echo -e "\n$FMESSAGE\n"
REQUEST
fi
}
REQUEST