我想暂停shell脚本中的输入,并提示用户进行选择。标准的是、否或取消类型问题。如何在典型的bash提示符中完成此操作?


当前回答

使用read命令:

echo Would you like to install? "(Y or N)"

read x

# now check if $x is "y"
if [ "$x" = "y" ]; then
    # do something here!
fi

然后你需要的所有其他东西

其他回答

我注意到,对于这样简单的用户输入,没有人发布显示多行回声菜单的答案,所以我的做法如下:

#!/bin/bash

function ask_user() {    

echo -e "
#~~~~~~~~~~~~#
| 1.) Yes    |
| 2.) No     |
| 3.) Quit   |
#~~~~~~~~~~~~#\n"

read -e -p "Select 1: " choice

if [ "$choice" == "1" ]; then

    do_something

elif [ "$choice" == "2" ]; then

    do_something_else

elif [ "$choice" == "3" ]; then

    clear && exit 0

else

    echo "Please select 1, 2, or 3." && sleep 3
    clear && ask_user

fi
}

ask_user

发布这种方法是希望有人发现它有用且省时。

作为单行命令的朋友,我使用了以下命令:

while [ -z $prompt ]; do read -p "Continue (y/n)?" choice;case "$choice" in y|Y ) prompt=true; break;; n|N ) exit 0;; esac; done; prompt=;

以长格式编写,其工作原理如下:

while [ -z $prompt ];
  do read -p "Continue (y/n)?" choice;
  case "$choice" in
    y|Y ) prompt=true; break;;
    n|N ) exit 0;;
  esac;
done;
prompt=;

此解决方案读取单个字符,并在yes响应时调用函数。

read -p "Are you sure? (y/n) " -n 1
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    do_something      
fi

绝对最简单的解决方案是这一行,没有巧妙的技巧:

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/

因为您不需要记住难看的命令和路径,但也不需要记住运行速度过快的脚本,而不需要在您决定它不是您想要运行的脚本之前停止。

Bash为此选择了。以下是如何在脚本中使用它:

select result in Yes No Cancel
do
    echo $result
done

这是它使用的样子:

$ bash examplescript.sh
1) Yes
2) No
3) Cancel
#? 1
Yes
#? 2
No
#? 3
Cancel
#?