在bash中读取具有默认值的变量

我需要在bash脚本中从终端读取一个值。我希望能够提供一个用户可以更改的默认值。

# Please enter your name: Ricardo^

在这个脚本中,提示符是“请输入您的名字:”,默认值是“Ricardo”,光标位于默认值之后。有办法在bash脚本中做到这一点吗?

235418 次浏览
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname

设置默认值;打印出来;读取一个新值;如果有新值,则使用它代替默认值。在如何在提示符的末尾删除换行符方面,shell和系统之间存在(或曾经存在)一些差异。'\c'符号似乎在MacOS X 10.6.3上使用3。它可以在System V衍生的Unix的大多数变体上运行,使用Bourne或Korn shell。

还要注意,用户可能不会意识到幕后发生了什么;他们的新数据将输入在屏幕上已经出现的名字之后。格式可能会更好:

echo "Please enter your name ($name): \c"

你可以使用参数扩展,例如:

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

在括号之间的提示符中包含默认值是一种相当常见的约定

:-Richard部分做什么?来自bash手册:

< p > ${parameter:-word} 如果parameter未设置或为空,则替换word的展开。

.

.

.

同样值得注意的是……

在下面的每一种情况下,word都受到波浪号展开、参数展开、命令替换和算术展开的影响。

因此,如果你使用webpath=${webpath:-~/httpdocs},你将得到一个/home/user/expanded/path/httpdocs的结果,而不是~/httpdocs,等等。

在Bash 4中:

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

这将在提示符后显示名称,如下所示:

Please enter your name: Ricardo

将光标放在名称的末尾,并允许用户编辑它。最后一行是可选的,如果用户删除输入或默认值(提交null),则强制名称为原始默认值。

read -e -p "Enter Your Name:" -i "Ricardo" NAME


echo $NAME

注:

  • 此选项需要bash 4或更高版本(bash --version)
  • 在macos上,使用家酿 - brew.sh安装当前的bash
  • -e-i一起工作:-e使用readline-i使用readline插入文本
  • read的bash 4+手动页面 - linuxcommand.org

代码:

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

-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
#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" }'

我发现了这个问题,想找个方法来表达:

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

希望这能帮助别人,如果他们遇到同样的问题,不需要思考逻辑

我刚刚使用了我更喜欢的模式:

read name || name='(nobody)'