Прочитайте переменную в 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