Как прочитать только один символ в сценарии оболочки - PullRequest
18 голосов
/ 04 января 2012

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

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

Ответы [ 5 ]

37 голосов
/ 04 января 2012

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

read -n1 ans
18 голосов
/ 04 мая 2015

read -n1 работает на баш

Режим 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"
10 голосов
/ 04 января 2012

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

stty raw
REPLY=$(dd bs=1 count=1 2> /dev/null)
stty -raw
2 голосов
/ 06 февраля 2019
read -n1

читает только один символ из ввода

echo "$REPLY"

выводит результат на экран

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

0 голосов
/ 06 февраля 2019

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