web-dev-qa-db-ja.com

シェルスクリプトで1文字だけを読み取る方法

Cのgetche()のような同様のオプションが必要です。コマンドラインから単一の文字入力だけを読み取るにはどうすればよいですか?

readコマンドを使用して実行できますか?

25
footy

Kshでは基本的に次のことができます。

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

Bashでは、readが実行できます。

read -n1 ans
44
SiegeX

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"
22
fess .
read -n1

入力から正確に1文字を読み取る

echo "$REPLY"

結果を画面に出力します

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

3
Sergey Gurin

一部の人々は、「コマンドラインからの入力」で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
1
Mirko Steiner