如何在shell脚本中读取单个字符

发布于 2024-12-24 18:52:30 字数 99 浏览 1 评论 0原文

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

使用read命令我们可以做到吗?

I want similar option like getche() in C. How can I read just a single character input from command line?

Using read command can we do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

薄凉少年不暖心 2024-12-31 18:52:30

在 bash 中,read 可以做到这一点:

read -n1 ans

In bash, read can do it:

read -n1 ans
Saygoodbye 2024-12-31 18:52:30

read -n1 适用于 bash

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

因此,使用 stty -icanon -echodtmilano 的答案 的基础上构建可以避免这些问题。

#/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"

read -n1 works for bash

The stty raw mode prevents ctrl-c from working and can get you stuck in an input loop with no way out. Also the man page says stty -raw is not guaranteed to return your terminal to the same state.

So, building on dtmilano's answer using stty -icanon -echo avoids those issues.

#/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"
长亭外,古道边 2024-12-31 18:52:30

在 ksh 中你基本上可以这样做:

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

In ksh you can basically do:

stty raw
REPLY=$(dd bs=1 count=1 2> /dev/null)
stty -raw
傲影 2024-12-31 18:52:30
read -n1

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

echo "$REPLY"

将结果打印在屏幕

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

read -n1

reads exactly one character from input

echo "$REPLY"

prints the result on the screen

doc: https://www.computerhope.com/unix/bash/read.htm

半衬遮猫 2024-12-31 18:52:30

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

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

${parameter:offset:length}

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

读取脚本

#!/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

从 STDIN

脚本

#!/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

Some people mean with "input from command line" an argument given to the command instead reading from STDIN... so please don't shoot me. But i have a (maybe not most sophisticated) solution for STDIN, too!

When using bash and having the data in a variable you can use parameter expansion

${parameter:offset:length}

and of course you can perform that on given args ($1, $2, $3, etc.)

Script

#!/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

Execution

$ ./test.sh foo
1
a
f

reading from STDIN

Script

#!/usr/bin/env bash

echo please type in your message:
read message
echo 1st char: ${message:0:1}

Execution

$ ./test.sh 
please type in your message:
Foo
1st char: F
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文