【发布时间】:2011-02-08 05:06:31
【问题描述】:
我需要在 bash 脚本中从终端读取一个值。我希望能够提供用户可以更改的默认值。
# Please enter your name: Ricardo^
在此脚本中,提示是“请输入您的姓名:”,默认值为“Ricardo”,光标将位于默认值之后。有没有办法在 bash 脚本中做到这一点?
【问题讨论】:
我需要在 bash 脚本中从终端读取一个值。我希望能够提供用户可以更改的默认值。
# Please enter your name: Ricardo^
在此脚本中,提示是“请输入您的姓名:”,默认值为“Ricardo”,光标将位于默认值之后。有没有办法在 bash 脚本中做到这一点?
【问题讨论】:
read -e -p "Enter Your Name:" -i "Ricardo" NAME
echo $NAME
注意事项:
bash --version)bash - brew.sh-e 和 -i 一起工作:-e 使用 readline,-i 使用 readline 插入文本
read - linuxcommand.org【讨论】:
-e 似乎是必须的,以允许 -i 实际工作
你可以使用parameter expansion,例如
read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name
在括号中的提示符中包含默认值是一种相当普遍的约定
:-Richard 部分有什么作用?来自 bash 手册:
${parameter:-word}如果参数未设置或为空,则替换单词的扩展。否则,参数的值被替换。
另外值得注意的是...
在以下每种情况下,单词都会受到波浪号扩展、参数扩展、命令替换和算术扩展的影响。
所以如果你使用webpath=${webpath:-~/httpdocs},你会得到/home/user/expanded/path/httpdocs而不是~/httpdocs等的结果。
【讨论】:
input,然后使用name=${input:-$name}。
name=${!input:-$name} 会做什么?
$1 变为 ${1:-some_default_string}
我刚刚使用了这种模式,我更喜欢:
read name || name='(nobody)'
【讨论】:
我发现了这个问题,正在寻找一种表达方式,例如:
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
希望能帮助遇到同样问题的人不必思考逻辑
【讨论】:
#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" }'
【讨论】:
-e 和 -t 参数不能一起使用。我尝试了一些表达式,结果是以下代码 sn-p :
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
【讨论】:
;)。这是允许的! 但是我们不想用不相关的东西污染其他问题。
代码:
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
【讨论】:
在 Bash 4 中:
name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"
这会在提示后显示名称,如下所示:
Please enter your name: Ricardo
将光标放在名称的末尾并允许用户对其进行编辑。最后一行是可选的,如果用户删除输入或默认值(提交 null),则强制名称为原始默认值。
【讨论】:
read命令中使用name而不是input即可。
$name 的值将被保留。这完全取决于您的需求。我在回答中说了这么多。不过,你说得对,我本可以更明确地说,如果不使用可选行,那么变量可能是 name。
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname
设置默认值;打印它;读取一个新值;如果有新值,请使用它代替默认值。关于如何在提示符末尾取消换行符,shell 和系统之间存在(或曾经)一些差异。 '\c' 符号似乎适用于带有 3.x bash 的 MacOS X 10.6.3,并且适用于使用 Bourne 或 Korn shell 的从 System V 派生的大多数 Unix 变体。
还要注意,用户可能不会意识到幕后发生的事情;他们的新数据将在屏幕上已经显示的名称之后输入。格式化它可能会更好:
echo "Please enter your name ($name): \c"
【讨论】:
printf 比 echo 更便携
if (test -z "$xxx"); ...' 和其他 C shellisms。
\c,因为它也支持echo -n!但是,您必须添加 -e 才能获得 bash 的回声来解释转义。我猜\c 是用于未说明的事情:echo -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
$ bash --version GNU bash, version 4.3.33(0)-release a) “我希望能够提供默认值用户可以更改的值。”您的 echo "Please enter your name: $name \c" 不允许我编辑默认值。 b)“并且光标将在默认值之后。”也不是真的……@Paused 的答案,直到另行通知。确实满足这两个要求。