在bash中读取一个默认值的变量
我需要在bash脚本中从终端读取一个值。我希望能够提供用户可以更改的默认值。在bash中读取一个默认值的变量
# Please enter your name: Ricardo^
在此脚本中,提示是“请输入您的姓名:”默认值为“Ricardo”,光标位于默认值之后。有没有办法在bash脚本中做到这一点?
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname
设置默认值;打印它;读一个新的价值;如果有新值,则用它代替默认值。在shell和系统之间存在(或者是)一些关于如何在提示结束时禁止换行符的变体。 '\ c'符号似乎可以在MacOS X 10.6.3上使用3.x bash,并且适用于从System V派生的大多数Unix变体,使用Bourne或Korn shell。
另请注意,用户可能不会意识到幕后发生了什么;他们的新数据将在屏幕上的名称后输入。这可能是更好的对其进行格式化:
echo "Please enter your name ($name): \c"
'printf'比'更便携echo' – ghostdog74 2010-04-15 03:54:50
@ ghostdog74:也许是这样;我们这些在25年前学习shell编程的人很难确定我们的哪些做法仍然相关。它越来越像bash改写了一切。我知道printf作为命令已经有一段时间了 - 我很少使用它,尽管(可能 - 从来没有?)。我得到的印象我应该闭嘴壳直到我(重新)学习bash。 “这很有趣;我工作的软件有一些不太好的shell脚本 - 但麻烦不是bash-isms。我只是厌倦了修复'if(test -z“$ xxx”); ......“和其他C shellism。 – 2010-04-15 07:20:40
在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
很好的答案!我只想提一提,我遇到了麻烦,因为我没有看到“里卡多”和NAME之间的空间,但是一旦我发现了...... *魔法*!谢谢! – 2012-06-17 00:05:05
不幸的是,我不是OSX的有效选项10.7 – undefined 2013-01-22 17:37:32
@BrianMortenson您可以使用自制软件升级bash:http://stackoverflow.com/questions/16416195/how-do-i-upgrade-bash-in-mac-osx -mountain-lion-and-set-it-the-correct-path – antonagestam 2014-04-01 22:13:04
代码:
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
我喜欢这个,因为它遵循我在很多shell脚本中看到的约定,默认值在冒号前的方括号中。谢谢!!! – morphatic 2017-08-04 18:35:23
-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
你的答案与这个问题没有太大关系,是吗?... – 2014-11-08 20:16:49
它的工作是使用-e和-t参数。 此代码行(-e和-i默认值): 读-e -p “输入你的名字:” -i “里卡多” NAME 不以countdowntimer(-t)工作 – speefak 2014-11-08 20:31:35
呀但这是在问题中没有问,是吗? – 2014-11-08 20:36:13
#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" }'
请将解释添加到您的答案。 – 2015-01-13 12:44:10
我发现这个问题,寻找一种方式来呈现类似:
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)'
我最终做了一些基于此。读入一个临时变量'input',然后使用'name = $ {input: - $ name}'。 – rmarimon 2010-04-15 05:05:15
这实际上并没有回答这个问题。应在提示中显示默认值。 – 2011-10-26 00:47:21
和'name = $ {!input: - $ name}'会做什么? – 2015-03-17 10:27:49