Linux脚本在F1击球时执行某些操作

时间:2014-02-23 22:30:39

标签: linux bash

我有这个脚本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&它给出了完全不同的行为。我输入一个密钥,它说没有找到密钥。我虽然&只需在后台运行脚本

2 个答案:

答案 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解析转义序列)。

readbash内置命令 - 尝试help read