我需要在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)
在括号之间的提示中包含默认值是一个相当常见的约定
Jad*_*eda 145
read -e -p "Enter Your Name:" -i "Ricardo" NAME
echo $NAME
Run Code Online (Sandbox Code Playgroud)
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),则强制名称为原始默认值.
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)
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)