Bashで次のことをしたいと思います。テキストファイルがあり、ファイルを読み、キーストロークを待って、正しいボタンを押すたびに(1語の下)テキストファイルを印刷するスクリプトを呼び出したいと思います。
詳細な説明:テキストファイルが次のようになっているとします。
This is my
text file
私はこのキーボードボタンのグループを探しています[[:print:]]
。そのため、スクリプトを呼び出し
./script.sh textfile
て「A」を押すとThis
表示され、スペースボタンを押してThis
「O」を入力するとis
表示されます。すべての内容が表示されるまで、「M」を数回押すことができます。上記のすべての単語が印刷され、終了しました。
私がすでに持っているもの:
私はシングルキーを押すのを待ってから、それが有効なときに何かをする方法をすでに知っています。
while true; do
read -rsn1 input
if [[ "$input" =~ "[[:print]]" ]]; then
# do stuff on keypress
fi
done
また、ファイルをそのまま読み込む方法も知っています。ファイルをそのまま読み込む(私はLambertユーザーの答えを使用しました。)しかし、2つの組み合わせが私が望む方法で動作しないようです。
誰もがこれを行う方法を知っていれば幸いです。また、私が質問した内容の中に不明瞭な、間違った内容がある場合、または間違った場所/方法で質問した場合は、ご指摘ください。
明確にするために編集
テキストファイルには任意の数の行を含めることができます。キーを押すたびに、次の単語を印刷する必要があります。正確にcat
テキストファイルと同様に、スペースと改行文字を節約します(ファイル全体を一度に印刷するのではなく、キー入力時にのみ文字通り印刷する遅延スクリプトとして実装したいスクリプトを考えてください)。
答え1
1行ファイルの場合は遠くありません。配列を使って構文エラーを取り除きます。
read -a TMPARR < file
while read -n1 CH && [[ $CNT -lt ${#TMPARR[@]} ]]; do [[ "$CH" =~ [[:print:]] ]] && echo ${TMPARR[((CNT++))]}; done
複数行ファイルの場合は、以下を試してください。
while read -a TMPARR <&3
do CNT=0
[[ $CNT -lt ${#TMPARR[@]} ]] && read -sn1 CH
while read -sn1 CH && [[ $CNT -lt ${#TMPARR[@]} ]]
do [[ "$CH" =~ [[:print:]] ]] && echo ${TMPARR[((CNT++))]}
done
done 3< file
テキスト行を順次読み込み、端末から並列に読み取るには、入力ファイル記述子を分割する必要があります。