Моя намеченная цель состоит в том, чтобы создать сценарий, что, когда выполнено, проверит состояние установки, затем изменить его на противоположное состояние. Рассматриваемая установка расценивает ручное или нерабочее состояние настроек прокси в настройках 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"
Снова, то же (отсутствие) результаты.
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
Ваша проблема состоит в том, что Вы не можете использовать команду в условном операторе.
Вот фиксированный код:
#!/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