我想在 bash 中执行以下操作:我有一个文本文件,并且想要调用一个读取该文件的脚本,等待我的击键,每次按下正确的按钮时,它都会打印出一个单词(下一个单词)文本文件。
详细说明:让我们假设文本文件如下所示
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
我还知道如何逐字读取文件:逐字读取文件(我使用了用户兰伯特的回答)但这两者的组合似乎并没有按照我想要的方式工作。
如果有人知道如何做到这一点,我将不胜感激。另外,如果我确实提出了任何不清楚/错误的内容,或者我是否在错误的地方/方式提出了问题,请指出。
编辑以澄清
文本文件可以包含任意数量的行。每个按键都应该打印单词确切地就像它在文本文件中一样,即它节省了空格和换行符(将我想要实现的脚本想象为一个延迟的脚本,cat
它不是一次打印整个文件,而是仅在击键时逐字打印)
答案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
您必须拆分输入文件描述符才能顺序读取文本行并并行从终端读取。