我正在尝试制作一个简单的脚本来翻转我的计算机屏幕。我的第一个 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 ']'
希望这能让您深入了解:
- 如何调试你的脚本
- 更好地理解 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`