Мне нужна аналогичная опция, такая как 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 и может привести к тому, что вы застрянете в цикле ввода без выхода. Также на странице руководства говорится, что 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"
ash
(проверено с BusyBox v1.10.2) и для #!/bin/sh, являющегося dash
в debian.
- person Sam; 26.12.2018
read -n1
читает ровно один символ из ввода
echo "$REPLY"
выводит результат на экран
документ: https://www.computerhope.com/unix/bash/read.htm а>
Некоторые люди имеют в виду под «вводом из командной строки» аргумент, переданный команде вместо чтения из стандартного ввода... так что, пожалуйста, не стреляйте в меня. Но у меня есть (возможно, не самое сложное) решение для 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