我只是想为我的NAS复制一些文件而写一个小sript, 所以我在Shell-Scripting方面经验不足。 我知道Linux上的许多命令行工具使用以下sheme作为是/否输入
Are you yure [Y/n]
其中大写字母表示也将启动的标准操作 通过点击 Enter 。 这很适合快速使用。
我也希望实现类似的功能,但是我在缓存 Enter 键时遇到了一些麻烦。 这是我到目前为止所得到的:
read -p "Are you sure? [Y/n] " response
case $response in [yY][eE][sS]|[yY]|[jJ]|[#insert ENTER codition here#])
echo
echo files will be moved
echo
;;
*)
echo
echo canceld
echo
;;
esac
我可以添加我想要的内容,但它只是赢得 Enter 。
答案 0 :(得分:5)
这是一个快速解决方案:
read -p "Are you sure? [Y/n] " response
case $response in [yY][eE][sS]|[yY]|[jJ]|'')
echo
echo files will be moved
echo
;;
*)
echo
echo canceled
echo
;;
esac
答案 1 :(得分:5)
如果您使用bash
4,则可以使用默认答案“预先播种”响应,这样您就不必明确处理ENTER
。 (您还可以标准化response
的大小写以简化case
语句。
read -p "Are you sure? [Y/n] " -ei "y" response
response=${response,,} # convert to lowercase
case $response in
y|ye|yes)
echo
echo files will be moved
echo
;;
*)
echo
echo cancelled
echo
;;
答案 2 :(得分:4)
您应该使用read -n1
read -n1 -p "Are you sure? [Y/n] " response
case "$response" in
[yY]) echo "files will be moved";;
?) echo "canceled";;
esac
根据help read
:
-n nchars return after reading NCHARS characters rather than waiting
for a newline, but honor a delimiter if fewer than NCHARS
characters are read before the delimiter
答案 3 :(得分:4)
这有输入验证,接受“Y”,“y”,“空字符串”或“n”和“N”作为问题[Y / n]的有效输入。
#!/bin/bash
while : ; do # colon is built into bash; and is always true.
read -n1 -p "Are you sure? [Y/n] " response
echo
case "$response" in
y|Y|"") echo "files will be moved"; break ;; # Break out of while loop
n|N) echo -e "canceled"; break ;; # Break out of while loop
*) echo "Invalid option given." ;;
esac
done
答案 4 :(得分:1)
由于您提供了选项[y / n],因此可以更改代码(编辑):
#!/bin/bash
while true
do
echo "Are you sure? [Y/n]?"
read response
case $(echo ${response:-Y}|tr '[:lower:]' '[:upper:]') in
Y|YES)
echo "files will be moved!"
break
;;
N|NO)
echo "aborted!"
exit
;;
*)
echo "incorrect selection!"
;;
esac
done
答案 5 :(得分:0)
问了问题已经过去了几年,但是由于它仍然与搜索相关,我认为我会提供最终使用的不同方法。
我想将问题锁定在按下ay / n / enter且不发送提示要求的情况下,所以我(ab)使用了-s
回声抑制并提出了以下建议:
#!/bin/bash
echo "Confirm action [y/N]? "
while true; do
read -sn1 response
case "$response" in
[yY]) echo 'y'; break;;
[nN]|"") echo 'n'; exit 0;;
esac
done
在N或Enter上结束脚本,否则脚本将按预期进行。不需要额外的回显来输出用户选择,但我将其作为视觉反馈留在了
。此外,通过移动|""
,您可以将Enter键默认设置为是或否。