Я хочу подобную опцию, как getche()
в C. Как я могу прочитать только один ввод символов из командной строки?
С помощью команды read
мы можем это сделать?
Я хочу подобную опцию, как getche()
в C. Как я могу прочитать только один ввод символов из командной строки?
С помощью команды read
мы можем это сделать?
В ksh вы можете в основном сделать:
stty raw
REPLY=$(dd bs=1 count=1 2> /dev/null)
stty -raw
В bash, read
может это сделать:
read -n1 ans
read -n1
работает для bash
Режим stty raw
предотвращает работу ctrl-c и может заставить вас застрять во входном цикле без выхода. Также man-страница говорит, что stty -raw
не гарантирует возврат вашего терминала в одно и то же состояние.
Итак, опираясь на ответ dtmilano с помощью 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"
read -n1
читает только один символ из ввода
echo "$REPLY"
выводит результат на экран
Некоторые люди имеют в виду "ввод из командной строки" аргумент, переданный команде вместо чтения из 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