Shell用户提示(Y / n)

时间:2014-04-21 17:05:10

标签: linux bash shell

我只是想为我的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

6 个答案:

答案 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键默认设置为是或否。