【发布时间】:2012-02-02 07:10:25
【问题描述】:
我想要类似的选项,如 C 语言中的 getche()。我如何才能从命令行中读取单个字符输入?
使用read命令可以吗?
【问题讨论】:
我想要类似的选项,如 C 语言中的 getche()。我如何才能从命令行中读取单个字符输入?
使用read命令可以吗?
【问题讨论】:
在 bash 中,read 可以做到:
read -n1 ans
【讨论】:
在 ksh 中你基本上可以做到:
stty raw
REPLY=$(dd bs=1 count=1 2> /dev/null)
stty -raw
【讨论】:
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。
【讨论】:
有些人的意思是“从命令行输入”给命令一个参数,而不是从 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
【讨论】: