我有这个脚本start.sh
#!/bin/bash
while[1]
do
read -sn3 key
if [$key=="\033[[A"]
then
./test1
else
./test2
fi
done
我想设置一个永久循环检查,看看是否按了F1键。如果按下执行test1 else test2。我做了start.sh&在后台运行,以便其他程序可以运行。
我收到了错误 虽然找不到[1]命令 意外令牌'do'附近的语法错误 [f == \ 033]:找不到命令
此读取命令位于何处?我键入哪个读取,但没找到它。
另外,如果尝试./start.sh&它给出了完全不同的行为。我输入一个密钥,它说没有找到密钥。我虽然&只需在后台运行脚本
答案 0 :(得分:1)
您的代码中存在一些基本的语法问题(在发布清理这些内容之前考虑使用shellcheck),但该方法本身存在缺陷。点击“q”和“F1”会产生不同长度的输入。
这是一个依赖于转义序列全部来自同一个读取调用这一事实的脚本,这个内容很脏但很有效:
#!/bin/bash
readkey() {
local key settings
settings=$(stty -g) # save terminal settings
stty -icanon -echo min 0 # disable buffering/echo, allow read to poll
dd count=1 > /dev/null 2>&1 # Throw away anything currently in the buffer
stty min 1 # Don't allow read to poll anymore
key=$(dd count=1 2> /dev/null) # do a single read(2) call
stty "$settings" # restore terminal settings
printf "%s" "$key"
}
# Get the F1 key sequence from termcap, fall back on Linux console
# TERM has to be set correctly for this to work.
f1=$(tput kf1) || f1=$'\033[[A'
while true
do
echo "Hit F1 to party, or any other key to continue"
key=$(readkey)
if [[ $key == "$f1" ]]
then
echo "Party!"
else
echo "Continuing..."
fi
done
答案 1 :(得分:0)
试试这个:
#!/bin/bash
while true
do
read -sn3 key
if [ "$key" = "$(tput kf1)" ]
then
./test1
else
./test2
fi
done
使用tput
生成控制序列更加健壮,您可以在man terminfo
中看到完整列表。如果tput
不可用,您可以对大多数终端模拟器使用$'\eOP'
,对Linux控制台使用$'\e[[A'
(使用字符串$
进行bash解析转义序列)。
read
是bash
内置命令 - 尝试help read
。