2017-10-14 53 views
0

bash-newbie在这里。bash:比较字符串与grep-variable问题

我想用下面简单的脚本的快捷方式启用/禁用我的笔记本电脑的触控板:如果条件不过是从未进入

#!/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 

的。 echo $result显示该变量确实包含我想要比较的字符串值。我一直在寻找一段时间,但根本无法弄清楚为什么结果变量和字符串在if条件中不匹配。

+3

请看看:http://www.shellcheck.net/ – Cyrus

+0

用'echo“$ result”'替换'echo $ result'。变量中有两个选项卡。 – Cyrus

+0

你真的有条件使用'xinput'包含在后面的引号中吗?如果你想显示这些命令的输出,你需要使用'echo'之类的东西来放在它们的前面。而且,因为您已经在使用cmd替换的'$(cmd)'形式,所以对这些行也这样做。我猜你并不需要cmd替换你的有条件使用'xinput ...',。将有兴趣看看'shellcheck.net'标志。 (是的,它的确如此)。祝你好运。 – shellter

回答

1

通过grep获取的字符串在开始处有一个选项卡,它需要包含在比较的字符串中。再次检查echo "$result"(加引号)有帮助。

0

在bash(但不是更基本的shell)中,可以使用[[ ]]的模式匹配功能来检查字符串是否包含模式;使用这种方式,就不再需要担心领先的标签,甚至用grep挑选出相关线路的需求:

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

注意,* s的开始和图案到底是什么意思“开头任何事物“和”其次是任何事物“。

此外,这里并没有真正需要双引号$(xinput ...),但国际海事组织保持跟踪哪些地方是安全的,可以关闭双引号以及何时不安全,这是太麻烦了。 (=左边的[[ ]]里面比较是安全的地方之一,但右边没有,并且在[ ]它几乎是不安全的 - 祝你好运记得所有正确的!)所以我更喜欢总是使用双引号。