在bash中读取一个默认值的变量

问题描述:

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

# Please enter your name: Ricardo^ 

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

可以使用parameter expansion

read -p "Enter: " name 
name=${name:-Richard} 
echo $name 
+4

我最终做了一些基于此。读入一个临时变量'input',然后使用'name = $ {input: - $ name}'。 – rmarimon 2010-04-15 05:05:15

+26

这实际上并没有回答这个问题。应在提示中显示默认值。 – 2011-10-26 00:47:21

+0

和'name = $ {!input: - $ name}'会做什么? – 2015-03-17 10:27:49

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" 
+0

'printf'比'更便携echo' – ghostdog74 2010-04-15 03:54:50

+1

@ 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),强制名称为原始默认值。

+0

不能使用bash4,因为它在debian发行版中是非标准的。我需要一些能够毫无麻烦地工作的东西。 – rmarimon 2010-04-15 05:06:26

+0

不需要最后一行代码,只需在'read'命令中使用'name'而不是'input'即可。 – RNA 2012-03-15 23:59:14

+1

@RNAer:通过使用额外变量,如果用户删除建议值(并因此输入空字符串),则会保留'$ name'的值。这完全取决于你的需求。我在答复中说了很多。不过,你说得对,我可以更加明确地说,如果可选行没有被使用,那么这个变量可能是'name'。 – 2012-03-16 11:43:58

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

echo $NAME 
+1

很好的答案!我只想提一提,我遇到了麻烦,因为我没有看到“里卡多”和NAME之间的空间,但是一旦我发现了...... *魔法*!谢谢! – 2012-06-17 00:05:05

+25

不幸的是,我不是OSX的有效选项10.7 – undefined 2013-01-22 17:37:32

+0

@BrianMortenson您可以使用自制软件升级bash:http://*.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 
+0

我喜欢这个,因为它遵循我在很多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 
+0

你的答案与这个问题没有太大关系,是吗?... – 2014-11-08 20:16:49

+0

它的工作是使用-e和-t参数。 此代码行(-e和-i默认值): 读-e -p “输入你的名字:” -i “里卡多” NAME 不以countdowntimer(-t)工作 – speefak 2014-11-08 20:31:35

+0

呀但这是在问题中没有问,是吗? – 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" }' 
+3

请将解释添加到您的答案。 – 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 

希望帮助别人不必想出逻辑,如果他们遇到同样的问题

+0

非常好。如果某人只输入“k”或其他与给定选择不同的东西,甚至可以稍微改进一点。 – erikbwork 2017-04-10 12:03:24

+1

我刚刚写下这个评论后,抓挠了痒。我现在有一个shell函数,其中包括上述,我倾向于使用它。壳似乎没有很好地循环,所以我尽量避免它。我可能会测试我的函数的结果,并给出一个更多的尝试,但基本上,我正在编写管理工具,可能出现问题,所以我希望管理员能够在任何时候干净地停止脚本。 – sibaz 2017-04-11 10:06:55

我只是用这个模式,这是我比较喜欢:

read name || name='(nobody)'