【问题标题】:How to read just a single character in shell script如何在 shell 脚本中只读取一个字符
【发布时间】:2012-02-02 07:10:25
【问题描述】:

我想要类似的选项,如 C 语言中的 getche()。我如何才能从命令行中读取单个字符输入?

使用read命令可以吗?

【问题讨论】:

    标签: linux shell io ksh


    【解决方案1】:

    在 bash 中,read 可以做到:

    read -n1 ans
    

    【讨论】:

    • read -p "输入任意字符:" -n1 ans; echo -e "\n你输入了:$ans"
    【解决方案2】:

    在 ksh 中你基本上可以做到:

    stty raw
    REPLY=$(dd bs=1 count=1 2> /dev/null)
    stty -raw
    

    【讨论】:

      【解决方案3】:

      read -n1 适用于 bash

      stty raw 模式会阻止 ctrl-c 工作,并且会让你陷入输入循环而无路可走。手册页还说stty -raw 不能保证将您的终端返回到相同的状态。

      因此,在 dtmilano's answer 的基础上使用 stty -icanon -echo 可以避免这些问题。

      #/bin/ksh
      ## /bin/{ksh,sh,zsh,...}
      
      # read_char var
      read_char() {
        stty -icanon -echo
        eval "$1=\$(dd bs=1 count=1 2>/dev/null)"
        stty icanon echo
      }
      
      read_char char
      echo "got $char"
      

      【讨论】:

      • 这也适用于ash(使用“BusyBox v1.10.2”测试),并且在debian上“#!/bin/sh”是dash
      • 嗨“费斯。”。我认为我有责任通知您this questionthis meta question。而且我完全承诺要信守诺言(也许不是在我获得 75 分之后,这会使我降到 25 分,而且我可能会放弃“到处评论”,但是一旦我达到 100 分,我就会使用赏金系统)
      • @Sam 我建议你暂时保留你的代表,因为你需要各种事情的声誉:stackoverflow.com/help/privileges。我提供赏金,所以别担心。
      【解决方案4】:
      read -n1
      

      从输入中准确读取一个字符

      echo "$REPLY"
      

      在屏幕上打印结果

      文档:https://www.computerhope.com/unix/bash/read.htm

      【讨论】:

        【解决方案5】:

        有些人的意思是“从命令行输入”给命令一个参数,而不是从 STDIN 读取......所以请不要开枪。但我也有一个(也许不是最复杂的)STDIN 解决方案!

        当使用 bash 并将数据放在变量中时,您可以使用参数扩展

        ${parameter:offset:length}
        

        当然,您可以在给定的参数上执行该操作($1$2$3 等)

        脚本

        #!/usr/bin/env bash
        
        testdata1="1234"
        testdata2="abcd"
        
        echo ${testdata1:0:1}
        echo ${testdata2:0:1}
        echo ${1:0:1} # argument #1 from command line
        

        执行

        $ ./test.sh foo
        1
        a
        f
        

        从标准输入中读取

        脚本

        #!/usr/bin/env bash
        
        echo please type in your message:
        read message
        echo 1st char: ${message:0:1}
        

        执行

        $ ./test.sh 
        please type in your message:
        Foo
        1st char: F
        

        【讨论】:

        • 读取单个字符更多的是在字符到达时有条件地读取、等待或执行工作,而不是假设您已经成功读取了单个字符。这会无限期地阻塞,无论是否有 char 1,交替消耗它可以消耗的所有内容并等待更多,直到它消耗一些分隔符。它会丢弃分隔符,它可能是换行符、EOF 或您尝试读取的第一个字符(在这种情况下长度为 0。)在某些情况下有效,但是...警告购买者。
        猜你喜欢
        • 1970-01-01
        • 2019-02-10
        • 2021-02-07
        • 2016-07-25
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 2014-07-21
        相关资源
        最近更新 更多