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

В основном то, что я пытаюсь сделать, переключить клавиатуру для выключения или включения в зависимости от того, включено ли это в настоящее время или выключено. Когда клавиатура работает, выполнение сценария выключает ее, который является тем, что я хочу, чтобы она сделала.

Но по некоторым причинам, когда я выполняю его снова для включения клавиатуры, это все еще выключено, и все еще echos "Сенсорная панель был выключен", даже когда я хочу, чтобы это включило. Я надеюсь, что кто-то может помочь мне с моим вопросом.Спасибо!

0
задан 31 August 2018 в 03:02

2 ответа

Проблема в том, что ваше условие if неверно. Он не делает то, что, как вы думаете, он делает.

if TouchpadOff=0; then 

Это запускает TouchpadOff=0 как команду оболочки, которая создает переменную $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.

3
ответ дан 28 October 2019 в 01:36

TouchpadOff=0 как условие интерпретируется как присваивание, поэтому оно всегда верно (если переменная только для чтения).

Использовать числовое сравнение:

if (( TouchpadOff == 0 )) ; then
0
ответ дан 28 October 2019 в 01:36

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

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