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

时间:2012-01-04 11:16:21

标签: linux shell io ksh

我想在C中使用类似getche()的选项。如何从命令行中只读取一个字符输入?

我们可以使用read命令吗?

5 个答案:

答案 0 :(得分:37)

在bash中,read可以执行此操作:

read -n1 ans

答案 1 :(得分:18)

read -n1适用于bash

stty raw模式可以防止ctrl-c工作,并且可以让你陷入输入循环而无法解决。另外,手册页说stty -raw不能保证将终端返回到同一状态。

因此,使用stty -icanon -echo构建dtmilano's answer可以避免这些问题。

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

答案 2 :(得分:9)

在ksh你基本上可以做到:

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

答案 3 :(得分:1)

read -n1

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

echo "$REPLY"

在屏幕上打印结果

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

答案 4 :(得分:0)

有些人指的是“从命令行输入”,而不是从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

从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