创建 bash if/then 切换

创建 bash if/then 切换

我的目标是创建一个脚本,在运行时检查设置的状态,然后将其更改为相反的状态。 有问题的设置与 Ubuntu 设置中代理设置的手动或禁用状态有关。

我可以使用以下命令手动获取此设置的状态:

gsettings get org.gnome.system.proxy mode

这将返回automanualnone。我不使用第一个状态,所以从现在开始让我们忽略它。现在,一旦返回状态,我使用脚本的目标是运行以下命令之一:

gsettings set org.gnome.system.proxy mode 'manual'
gsettings set org.gnome.system.proxy mode 'none'

它运行的命令将处于当前未设置的状态。为此,我在脚本中尝试了以下内容:

if [ 'gsettings get org.gnome.system.proxy mode' = 'none' ]
then
gsettings set org.gnome.system.proxy mode 'manual'
notify-send "Manual"
else
if [ 'gsettings get org.gnome.system.proxy mode' = 'manual' ]
then
gsettings set org.gnome.system.proxy mode 'none'
notify-send "Disabled"
fi
fi

这保存在应用了 chmod +x 的文件中。从终端运行时,什么也没发生。我只是得到一个新行来等待新命令。

我哪里做错了?

此外,是否可以让它在一行上工作,如下所示:

sh -c "if [ $(gsettings get org.gnome.system.proxy mode) = \"'none'\" ];then gsettings set org.gnome.system.proxy mode 'manual' && notify-send \"Manual\";elif [ $(gsettings get org.gnome.system.proxy mode) = \"'manual'\" ];then gsettings set org.gnome.system.proxy mode 'none' && notify-send \"Disabled\";fi"

再次,结果相同(缺乏)。

答案1

然而,在这种情况下,该if语句是合适的工具,可以考虑将其case作为相关命令的单次运行的替代语句,并且可以说语法更清晰。

case "$(gsettings get org.gnome.system.proxy mode)" in

    "'none'") gsettings set org.gnome.system.proxy mode "'manual'" 
              notify-send "manual";;
    "'manual'") gsettings set org.gnome.system.proxy mode  "'none'"
                notify-send "Disabled" ;;

esac

请注意,gsettings get有问题的命令返回单引号字符串,因此您需要检查这一点。

至于您的具体代码,问题在于您正在进行字符串比较,但您确实需要命令替换$()

if [ "$(gsettings get org.gnome.system.proxy mode)" = "'none'" ]
then
    gsettings set org.gnome.system.proxy mode "'manual'"
    notify-send "Manual"
elif [ "$(gsettings get org.gnome.system.proxy mode)" = "'manual'" ]
then
    gsettings set org.gnome.system.proxy mode "'none'"
    notify-send "Disabled"
fi

这是您编辑的代码。请注意,语法也不正确,shell 语法中没有,else if但有elif。此外,两个测试两次调用相同的命令。这效率不高。使用单个命令替换,如下所示Gavin 的回答

答案2

您的问题是您不能在 if/then 语句中使用命令。

修复后的代码如下:

#!/bin/bash
output=$(gsettings get org.gnome.system.proxy mode)
if [ "$output" = 'none' ]
then
    gsettings set org.gnome.system.proxy mode 'manual'
    notify-send "Manual"
else
    if [ "$output" = 'manual' ]
    then
        gsettings set org.gnome.system.proxy mode 'none'
        notify-send "Disabled"
    fi
fi

相关内容