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

# Please enter your name: Ricardo^

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


当前回答

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

read name || name='(nobody)'

其他回答

在Bash 4中:

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

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

Please enter your name: Ricardo

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

#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" }'
read -e -p "Enter Your Name:" -i "Ricardo" NAME

echo $NAME

注:

此选项需要bash 4或更高版本(bash——version) 在macos上,使用homebrew - brew.sh安装当前bash -e和-i一起工作:-e使用readline, -i使用readline插入文本 Bash 4+手册页阅读linuxcommand.org

您可以使用参数展开,例如:

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

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

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

${参数:词} 如果parameter未设置或为空,则替换word的展开。否则,参数的值将被替换。

同样值得注意的是……

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

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

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"