Создание удара, если/затем переключатель

Моя намеченная цель состоит в том, чтобы создать сценарий, что, когда выполнено, проверит состояние установки, затем изменить его на противоположное состояние. Рассматриваемая установка расценивает ручное или нерабочее состояние настроек прокси в настройках Ubuntu.

Я могу вручную получить состояние этой установки с командой:

gsettings get org.gnome.system.proxy mode

Это возвратится auto, manual, или none. Я не использую первое состояние, поэтому давайте проигнорируем это отсюда на. Теперь, после того как состояние возвращается, моя цель со сценарием состоит в том, чтобы затем выполнить любую из следующих команд:

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"

Снова, то же (отсутствие) результаты.

4
задан 18 October 2018 в 09:18

2 ответа

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

Это - Ваш отредактированный код. Обратите внимание, что синтаксис также не был правилен, существует нет else if но существует elif в синтаксисе оболочки. Кроме того, два теста называют ту же команду дважды. Это не эффективно. Используйте единственную замену команды как показано в ответе Gavin

1
ответ дан 1 December 2019 в 10:31

Ваша проблема состоит в том, что Вы не можете использовать команду в условном операторе.

Вот фиксированный код:

#!/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
0
ответ дан 1 December 2019 в 10:31

Другие вопросы по тегам:

Похожие вопросы: