Как прочитать только один символ в сценарии оболочки

Я хочу подобную опцию, как getche() в C. Как я могу прочитать только один ввод символов из командной строки?

С помощью команды read мы можем это сделать?

Ответ 1

В ksh вы можете в основном сделать:

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

Ответ 2

В bash, read может это сделать:

read -n1 ans

Ответ 3

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"

Ответ 5

Некоторые люди имеют в виду "ввод из командной строки" аргумент, переданный команде вместо чтения из 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