我需要在bash脚本中从终端读取一个值。我希望能够提供用户可以更改的默认值。
# Please enter your name: Ricardo^
在此脚本中,提示为“请输入您的名称:”,默认值为“里卡多”,光标将位于默认值之后。有什么办法可以在bash脚本中做到这一点?
我需要在bash脚本中从终端读取一个值。我希望能够提供用户可以更改的默认值。
# Please enter your name: Ricardo^
在此脚本中,提示为“请输入您的名称:”,默认值为“里卡多”,光标将位于默认值之后。有什么办法可以在bash脚本中做到这一点?
Answers:
您可以使用参数扩展,例如
read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name
在方括号之间的提示中包括默认值是很常见的约定
name=${!input:-$name}
办?
$1
成为${1:-some_default_string}
read -e -p "Enter Your Name:" -i "Ricardo" NAME
echo $NAME
-e
似乎必须强制性的才能-i
实际工作
在Bash 4中:
name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"
这样会在提示符后显示名称:
Please enter your name: Ricardo
将光标放在名称的末尾,并允许用户对其进行编辑。最后一行是可选的,如果用户删除了输入或默认值(提交空值),则强制名称为原始默认值。
name
而不是。input
read
$name
如果用户删除建议的值(并因此输入空字符串),则将保留的值。这完全取决于您的需求。我在回答中说了很多。没错,不过,我本来可以更明确地说,如果不使用可选行,则变量可以是name
。
码:
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
我发现了这个问题,寻找一种呈现类似内容的方法:
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
希望如果遇到同样的问题,可以帮助某人不必思考逻辑
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 Shells在从System V派生的Unix的大多数变体上运行。
还要注意,用户可能不会意识到幕后情况。他们的新数据将在屏幕上已经显示名称之后输入。格式化它可能更好:
echo "Please enter your name ($name): \c"
printf
比更便携echo
if (test -z "$xxx"); ...
'和其他C shell行为。
\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!"
#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参数不能一起使用。我尝试了一些表达式,结果是以下代码片段:
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
;)
。这样就可以了!但是我们不想用无关的内容污染其他问题。
input
,然后使用name=${input:-$name}
。