我应该先说明我以前从未使用过shell脚本,所以这对我来说都是新手。我能够制作出有效的东西,但是非常优化,我不知道如何改进它。如果有的话,这是一个非常有趣的剧本:
#/bin/bash
get_char() {
old_tty_settings=`stty -g`
stty -icanon min 0 time 1
stty cbreak
grabbed_char=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
stty -cbreak
stty "$old_tty_settings"
}
while true; do
unset char00
unset char01
unset char02
unset char03
unset char04
unset char05
echo -e "\nWaiting for keystroke..."
read -n 1 char00
while true; do
get_char; char01=$grabbed_char
if [ "$char01" != "" ]; then get_char; char02=$grabbed_char
else break
fi
if [ "$char02" != "" ]; then get_char; char03=$grabbed_char
else break
fi
if [ "$char03" != "" ]; then get_char; char04=$grabbed_char
else break
fi
if [ "$char04" != "" ]; then get_char; char05=$grabbed_char
else break
fi
done
fullstring=$char00$char01$char02$char03$char04$char05
echo -e "\nFULLSTRING: !$fullstring!"
done
这份名单要长得多,但我没有让你幸免。
基本上,程序需要永远坐在终端等待击键。在初始击键后,需要等待很短的时间(在这种情况下为1/10秒)进行另一次击键。如果在这么短的时间内没有注册击键,它会回显输出(将使用sed命令进行管道传输),然后重新启动。
它适用于条形码扫描仪,您可以扫描4个字符或100个字符。我们希望尽快处理数据,这意味着我们不希望扫描一些东西后延迟1秒。
一个好的解决方案是,如果收到一个角色就可以创建“charXX”。谢谢你的帮助。
答案 0 :(得分:2)
用这个替换你的内心会做你想要的吗?
read -n 1 fullstring
while true; do
get_char
if [ -n "$grabbed_char" ] ; then
fullstring="$fullstring$grabbed_char"
else
break
fi
done
echo -e "\nFULLSTRING: !$fullstring!"
顺便说一句,在没有内置的旧shell上,用这个替换if会运行得更快:
case "$grabbed_char" in
"") break ;;
*) fullstring="$fullstring$grabbed_char" ;;
esac