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