Читать переменную в bash со значением по умолчанию - PullRequest
147 голосов
/ 15 апреля 2010

Мне нужно прочитать значение из терминала в bash-скрипте. Я хотел бы иметь возможность предоставить значение по умолчанию, которое пользователь может изменить.

# Please enter your name: Ricardo^

В этом скрипте приглашение «Пожалуйста, введите ваше имя»: значением по умолчанию является «Ricardo», а курсор будет после значения по умолчанию Есть ли способ сделать это в скрипте bash?

Ответы [ 9 ]

202 голосов
/ 15 апреля 2010

вы можете использовать расширение параметра например

read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name

Включение значения по умолчанию в подсказке между скобками является довольно распространенным соглашением

136 голосов
/ 15 июля 2011
read -e -p "Enter Your Name:" -i "Ricardo" NAME

echo $NAME
43 голосов
/ 15 апреля 2010

В Баш 4:

name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"

Это имя после приглашения отображается следующим образом:

Please enter your name: Ricardo

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

14 голосов
/ 12 мая 2013

Код:

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
13 голосов
/ 11 августа 2015

Я нашел этот вопрос, ища способ представить что-то вроде:

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

Надеюсь, что это поможет кому-то не придумывать логику, если он столкнется с той же проблемой

10 голосов
/ 09 сентября 2015

Я только что использовал этот шаблон, который я предпочитаю:

read name || name='(nobody)'
6 голосов
/ 15 апреля 2010
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"
1 голос
/ 13 января 2015
#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" }'
0 голосов
/ 08 ноября 2014

Параметр -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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...