Bash:“if”语句似乎总是将第一个条件评估为真,即使条件为假

Bash:“if”语句似乎总是将第一个条件评估为真,即使条件为假

我最近才开始使用 bash,但在使用一个简单的命令时遇到了麻烦。以下是脚本:

#!/bin/bash
if TouchpadOff=0; then 
    synclient TouchpadOff=1
    echo "Touchpad has been turned off"
else
    synclient TouchpadOff=0
    echo "Touchpad has been turned on"
fi

基本上,我想做的是根据 pad 当前是打开还是关闭来切换 pad 的关闭或打开状态。当 pad 打开时,运行脚本会将其关闭,这正是我想要它做的事情。

但不知为何,当我再次运行它来打开触摸板时,它仍然处于关闭状态,并且仍然会回显“触摸板已关闭”,即使我想打开它。我希望有人能帮我解答我的问题。谢谢!

答案1

问题是你的 if 条件是错误的。它并没有按照你的想法去做。

if TouchpadOff=0; then 

这将TouchpadOff=0作为 shell 命令运行,创建一个变量$TouchpadOff并为其分配值0。由于这通常会成功运行,因此结果是条件始终为真。

您必须调用该synclient命令并解析其输出以检查 TouchpadOff 属性的状态,例如这样:

if [[ "$(synclient | grep 'TouchpadOff' | awk '{print $3}')" -eq 0 ]] ; then

这将运行synclient | grep 'TouchpadOff' | awk '{print $3}',它解析 的输出以查找synclient包含“TouchpadOff”的行并返回该行的第三列。
它位于命令替换 中$( ... ),因此整个部分将被替换为内部命令的输出。
然后[[ ... -eq 0 ]]检查替换的输出是否等于 0 并将其作为 if 语句的条件。

答案2

TouchpadOff=0因为条件被解释为赋值,所以它始终为真(除非变量是只读的)。

使用数值比较:

if (( TouchpadOff == 0 )) ; then

相关内容