(病)逻辑陈述

(病)逻辑陈述

我正在尝试制作一个简单的脚本来翻转我的计算机屏幕。我的第一个 if 语句完美执行,但之后,认为 $istouch 是“on”,elif 语句块将不会执行!我尝试使用 -u 选项运行 bash,没有失败,并尝试切换检查,但没有任何效果。

#!/bin/bash
xsetwacom --set 16 touch False
istouch='xsetwacom --get 15 touch'
$istouch
if [ "$istouch"=="off" ]
then
    xrandr -o inverted
    xinput set-prop 13 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1
    xinput set-prop 15 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1
    xinput set-prop 16 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1
    xsetwacom --set 15 touch True

elif [ "$istouch"=="on" ]
then
    xrandr -o 0
    xinput set-prop 13 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1
    xinput set-prop 15 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1
    xinput set-prop 16 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1
    xsetwacom --set 15 touch False
fi

答案1

你的if陈述并没有按照你的想法进行。您可以通过包含该命令来打开 Bash 脚本的调试set -x,然后使用 关闭它set +x

例子

所以我们首先像这样添加调试:

#!/bin/bash

## DEBUG
set -x
xsetwacom --set 16 touch False
....

然后我运行你的脚本,我称之为ex.bash,所以我调用它:

$ ./ex.bash

Bash 尝试执行这一行:

if [ "$istouch"=="off" ]

从输出中,我们可以看到 Bash 变得混乱了。它与字符串一起运行'xsetwacom --get 15 touch==off'

+ '[' 'xsetwacom --get 15 touch==off' ']'

的争论==不应该这样触及它。 Bash 对此类事情的挑剔是出了名的。因此,在前后留一些空格,如下所示:

 if [ "$istouch" == "off" ]
 elif [ "$istouch" == "on" ]

所以现在看起来好一点了:

+ '[' 'xsetwacom --get 15 touch' == off ']'
+ '[' 'xsetwacom --get 15 touch' == on ']'

但是,您不想比较 Stirng $istouch,而是想比较该字符串表示的命令的结果,因此将脚本的顶部更改为:

....
xsetwacom --set 16 touch False
istouch=$(xsetwacom --get 15 touch)
if [ "$istouch" == "off" ]
....

现在我们运行命令xsetwacom并将结果存储在 中$istouch。我没有这些设备,所以我收到一条关于 的消息device 15。但这是脚本现在所做的:

++ xsetwacom --get 15 touch
+ istouch='Cannot find device '\''15'\''.'
+ '[' 'Cannot find device '\''15'\''.' == off ']'
+ '[' 'Cannot find device '\''15'\''.' == on ']'

希望这能让您深入了解:

  1. 如何调试你的脚本
  2. 更好地理解 Bash 语法

更深入地了解 if 语句

您可能会想知道为什么该if语句完全匹配。问题是,如果你给[命令一个单一的字符串,如果该字符串不为空,它就会将此视为一个事实,并且 if 语句将落入其then部分。

例子

$ [ "no"=="yes" ] && echo "they match"
they match

$ [ "notheydont"=="yes" ] && echo "they match"
they match

看起来这里发生了相等检查,但实际上并没有。[ some-string ]是 的缩写[ -n some-string ],这是一个测试一些字符串[n]on-empty。使用向set -x我们展示了这一点:

$ set -x; [ "notheydont"=="yes" ] && echo "they match"; set +x
+ '[' notheydont==yes ']'
+ echo 'they match'
they match
+ set +x

如果我们在相等检查的参数之间放置一些空格:

# fails
$ set -x; [ "notheydont" == "yes" ] && echo "they match"; set +x
+ '[' notheydont == yes ']'
+ set +x

# passes
$ set -x; [ "yes" == "yes" ] && echo "they match"; set +x
+ set -x
+ '[' yes == yes ']'
+ echo 'they match'
they match
+ set +x

现在它按预期工作了!

答案2

代替

istouch='xsetwacom --get 15 touch'
$istouch

与(注意反引号):

istouch=`xsetwacom --get 15 touch`

相关内容