此版本允许您拥有多个案例y或Y,n或N

此版本允许您拥有多个案例y或Y,n或N

编辑:

似乎在 内有效bash。问题似乎与 有关zsh。如果有更好的网站可以发布此问题,请告诉我。


我正在编写一个创建一系列目录的简单脚本。我希望用户在我执行此操作之前进行确认。我使用以下内容作为基础,但似乎无法让它在 bash 函数中运行。如果我将它放在函数之外,它可以正常工作。这是一个孤立的例子:

读取脚本

#!/bin/bash
test() {
  read -p "Here be dragons. Continue?" -n 1 -r
  if [[ $REPLY =~ ^[Yy]$ ]]
  then
    echo "You asked for it..."
  fi
}

代码来自所以发帖。

获取文件和/或test导致以下错误:read:1: -p: no coprocess。当我将其放在我的.bashrc

编辑:

@hennes

  1. 我希望该函数位于配置文件中,这样我就可以从任何目录调用它(理想情况下是我的 .bashrc 或 .zshrc)
  2. 我已更正第一行注释的格式。问题仍然存在于zsh
  3. Bash 版本是 3.2,但是您帮助我弄清楚问题出在 zsh 而不是 bash。

答案1

–pbash选项对于的read内置命令和zshread内置命令来说含义不同。在zshread命令中,–p意思是——猜测——“输入是从协同进程读取的。”我建议你用echo或显示你的提示printf

您可能还需要更换–n 1–k或者–k 1


zsh的等价bashread -p prompt

read "?Here be dragons. Continue?"

第一个参数中a 后面的任何内容?都用作提示字符串。

当然,您可以指定要读入的变量名(这可能是更好的风格):

read "brave?Here be dragons. Continue?"
if [[ "$brave" =~ ^[Yy]$ ]]
then
    ...
fi

(引用 shell 变量通常也是一个好主意。)

答案2

该代码似乎可以在 zsh 中完成您想要的操作。
(请注意,您引用的问题明确提到它是针对 bash 的)。

#!/usr/bin/env zsh

test()
{
  echo -n "Here be dragons. Continue?"
  read REPLY

  if [[ $REPLY =~ ^[Yy]$ ]]
  then
    echo "You asked for it..."
  fi
}

test

三条评论:

答案3

此版本允许您拥有多个案例yYnN

  1. 可选:重复该问题,直到提供批准问题

  2. 可选:忽略任何其他答案

  3. 可选:如果需要,退出终端

    confirm() {
        echo -n "Continue? y or n? "
        read REPLY
        case $REPLY in
        [Yy]) echo 'yup y' ;; # you can change what you do here for instance
        [Nn]) echo 'nope n' ;;
        # Here are a few optional options to choose between
        # Any other answer:
    
        # 1. Repeat the question
        *) confirm ;;
    
        # 2. ignore
        # *) ;;
    
        # 3. Exit terminal
        # *) exit ;;
    
        esac
        # REPLY=''
    }
    

还要注意:在此函数的最后一行清除 REPLY 变量。否则,你echo $REPLY会发现它仍然被设置,直到你打开或关闭终端或再次设置它。

相关内容