我想暂停shell脚本中的输入,并提示用户进行选择。标准的是、否或取消类型问题。如何在典型的bash提示符中完成此操作?
当前回答
绝对最简单的解决方案是这一行,没有巧妙的技巧:
read -p "press enter ..." y
它让人想起了经典的DOS点击任意键继续,除了它等待Enter键,而不仅仅是任何键。
的确,这并没有为您提供“是”“否”“取消”的三个选项,但在您接受control-C作为“否”的情况下,这很有用。在简单脚本中取消,例如:
#!/bin/sh
echo Backup this project
read -p "press enter ..." y
rsync -tavz . /media/hard_to_remember_path/backup/projects/yourproject/
因为您不需要记住难看的命令和路径,但也不需要记住运行速度过快的脚本,而不需要在您决定它不是您想要运行的脚本之前停止。
其他回答
我为回答是/否问题编写了一个小脚本:https://github.com/optimistiCli/getans
例子:
#!/bin/bash
if ! getans.sh 'Shall we proceed?' y ; then
echo "User said “NO”"
exit 1
fi
echo "User said “YES”"
# do something usefull
exit 0
直接链接:https://github.com/optimistiCli/getans/raw/main/getans.sh
在我的情况下,我需要从下载的脚本中读取。,
curl -Ss https://example.com/installer.sh | sh
在这种情况下,read-ryn</dev/tty行允许它读取输入。
printf "These files will be uploaded. Is this ok? (y/N) "
read -r yn </dev/tty
if [ "$yn" = "y" ]; then
# Yes
else
# No
fi
这个问题有很多很好的答案,但从我看来,没有一个是我的理想,那就是:
简单一点,只需要几行外壳使用单个y/n键(无需按enter键)如果只按回车键,则默认为yes也可以使用大写的Y/N
这是我的版本,它具有这些财产:
read -n1 -p "Continue? (Y/n) " confirm
if ! echo $confirm | grep '^[Yy]\?$'; then
exit 1
fi
如果要在两个分支上运行代码,可以修改该条件,使其仅在“yes”上运行(只需删除if语句中的!)或添加else。
一个衬垫:
read -p "Continue? [Enter] → Yes, [Ctrl]+[C] → No."
这假设“否”和“取消”具有相同的结果,因此没有理由区别对待它们。
在这种情况下,我已经多次使用case语句,使用case语句是一种很好的方法。可以实现while循环,该循环模拟case块,利用布尔条件,以便更好地控制程序,并满足许多其他要求。在满足所有条件后,可以使用中断,将控制权传递回程序的主要部分。此外,为了满足其他条件,当然可以在控制结构中添加条件语句:case语句和可能的while循环。
使用案例陈述来满足您的请求的示例
#! /bin/sh
# For potential users of BSD, or other systems who do not
# have a bash binary located in /bin the script will be directed to
# a bourne-shell, e.g. /bin/sh
# NOTE: It would seem best for handling user entry errors or
# exceptions, to put the decision required by the input
# of the prompt in a case statement (case control structure),
echo Would you like us to perform the option: "(Y|N)"
read inPut
case $inPut in
# echoing a command encapsulated by
# backticks (``) executes the command
"Y") echo `Do something crazy`
;;
# depending on the scenario, execute the other option
# or leave as default
"N") echo `execute another option`
;;
esac
exit