0

我应该先说我以前从未使用过 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”。谢谢你的帮助。

4

1 回答 1

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 上,用 this 替换 if 会运行得更快:

case "$grabbed_char" in
    "")  break ;;
    *) fullstring="$fullstring$grabbed_char" ;;
esac
于 2013-01-24T18:01:13.850 回答