使用默认值读取bash中的变量

Ric*_*mon 163 bash shell

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

# Please enter your name: Ricardo^
Run Code Online (Sandbox Code Playgroud)

在此脚本中,提示符为"请输入您的姓名:",默认值为"Ricardo",光标将在默认值之后.有没有办法在bash脚本中执行此操作?

gho*_*g74 229

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

read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name
Run Code Online (Sandbox Code Playgroud)

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

  • 这实际上并没有回答这个问题.默认值应显示在提示中. (38认同)
  • @ Dr.PersonPersonII - 您可以通过执行以下操作添加默认值:read -p"输入远程主机名[$ remote_host_default]:"remote_host remote_host = $ {remote_host: - $ remote_host_default} (7认同)
  • 我最终做了一些基于此的事情.读入临时变量`input`然后使用`name = $ {input: - $ name}`. (6认同)
  • `$ 1`变成`$ {1:-some_default_string}` (4认同)
  • 什么将`name = $ {!input: - $ name}`做什么? (3认同)

Jad*_*eda 145

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

echo $NAME
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,-i不是OSX 10.7的有效选项 (34认同)
  • @BrianMortenson您可以使用自制软件升级bash:http://stackoverflow.com/questions/16416195/how-do-i-upgrade-bash-in-mac-osx-mountain-lion-and-set-it-the-correct -路径 (3认同)
  • 此答案显示了如何在OS X(Bash 3.x)上实现此功能:http://stackoverflow.com/questions/22634065/bash-read-command-does-not-accept-i-parameter-on-mac-任何替代 (2认同)
  • 请注意,`-e`似乎是强制性的,以允许`-i`实际上起作用 (2认同)

Pau*_*ce. 46

在Bash 4中:

name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"
Run Code Online (Sandbox Code Playgroud)

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

Please enter your name: Ricardo
Run Code Online (Sandbox Code Playgroud)

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

  • @RNAer:通过使用额外的变量,如果用户删除了建议的值(因此输入了空字符串),则保留了 $name 的值。这一切都取决于您的需求。我在回答中说了这么多。不过,您说得对,我本来可以更明确地说,如果不使用可选行,那么变量可能是“name”。 (2认同)

man*_*h_s 16

码:

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"
Run Code Online (Sandbox Code Playgroud)

样品运行:

Please enter IN_PATH [/tmp/input.txt]: 
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt
Run Code Online (Sandbox Code Playgroud)


sib*_*baz 13

我找到了这个问题,寻找一种方式来呈现如下:

Something interesting happened.  Proceed [Y/n/q]:
Run Code Online (Sandbox Code Playgroud)

使用上面的例子,我推断出:

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
Run Code Online (Sandbox Code Playgroud)

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


buk*_*zor 11

我刚刚使用了这种模式,我更喜欢这种模式:

read name || name='(nobody)'
Run Code Online (Sandbox Code Playgroud)

  • 我在 zsh 和 bash 上尝试过,但在这两个 shell 中都不起作用。 (2认同)

Jon*_*ler 6

name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname
Run Code Online (Sandbox Code Playgroud)

设置默认值; 打印它; 读一个新值; 如果有新值,请使用它代替默认值.shell和系统之间存在(或者是)一些关于如何在提示结束时抑制换行的变化.'\ c'符号似乎适用于带有3.x bash的MacOS X 10.6.3,适用于使用Bourne或Korn shell从System V派生的大多数Unix变体.

另请注意,用户可能不会意识到幕后发生的事情; 他们的新数据将在屏幕上已有名称后输入.格式化它可能更好:

echo "Please enter your name ($name): \c"
Run Code Online (Sandbox Code Playgroud)

  • @ ghostdog74:也许是这样; 我们这些25年前学过shell编程的人很难确定我们的哪些实践仍然相关.它看起来越来越像bash重写了一切.我知道printf已经有一段时间作为命令了 - 尽管我很少使用它(可能 - 从来没有?).我得到的印象是我应该闭嘴,直到我(重新)学习bash.'很有趣; 我工作的软件有shell脚本不能正常工作 - 但麻烦不是bash-isms.我只是厌倦了修复'`if(test -z"$ xxx"); ......'和其他C shellism. (3认同)