0

bash 新手在这里。

我想使用以下简单脚本作为启用/禁用笔记本电脑触摸板的快捷方式:

#!/bin/bash

result=$(xinput --list-props 11 | grep "Device Enabled")
echo $result
# Output: Device Enabled (140): 1

if [[ "$result" = "Device Enabled (140): 1" ]]; then
        `xinput set-prop 11 "Device Enabled" 0`
else
        `xinput set-prop 11 "Device Enabled" 1`
fi

但是,从未输入 if 条件。echo $result表明该变量确实包含我要比较的字符串值。我已经搜索了一段时间,但根本无法弄清楚为什么结果变量和字符串在 if 条件中不匹配。

4

2 回答 2

1

grep 得到的字符串开头有一个制表符,需要包含在比较字符串中。再次检查echo "$result"(加上引号)有帮助。

于 2017-10-14T19:59:55.290 回答
0

在 bash(但不是更基本的 shell)中,您可以使用[[ ]]' 的模式匹配功能来检查字符串是否包含模式;以这种方式使用它无需担心前导选项卡,甚至无需使用grep来挑选相关行:

if [[ "$(xinput --list-props 11 | grep "Device Enabled")" = *"Device Enabled (140): 1"* ]]; then

请注意,*模式开头和结尾的 s 分别表示“在任何东西之前”和“在任何东西之后”。

此外,这里的双引号$(xinput ...)并不是真正必要的,但是 IMO 跟踪哪些地方可以安全地关闭双引号以及何时不安全是太麻烦了。=(里面比较的左边[[ ]]是安全的地方之一,但右边不是,而且[ ]几乎从来都不安全——祝你好运!)所以我更喜欢总是使用双引号。

于 2017-10-14T20:24:10.470 回答