(Ill) Логическое утверждение

Я пытаюсь сделать простой сценарий, чтобы перевернуть экран моего компьютера. Мой первый оператор if выполняется отлично, но после этого мысль $ istouch «включена», блок оператора elif не будет выполняться! Я попытался запустить bash с параметром -u без сбоев и попытался переключить проверки, ничего не работает.

#!/bin/bash xsetwacom --set 16 touch False istouch='xsetwacom --get 15 touch' $istouch if [ "$istouch"=="off" ] then xrandr -o inverted xinput set-prop 13 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1 xinput set-prop 15 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1 xinput set-prop 16 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1 xsetwacom --set 15 touch True elif [ "$istouch"=="on" ] then xrandr -o 0 xinput set-prop 13 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1 xinput set-prop 15 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1 xinput set-prop 16 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1 xsetwacom --set 15 touch False fi 

  • Ошибка скрипта, но копирование и вставка из скриптов
  • Ping хост, проверьте, жив ли он или нет, и отправьте результат в файл через скрипт оболочки
  • grepping массив из файла и повторное использование шаблона поиска
  • Сравнение значений в одной строке
  • Определение наличия хоста в сети
  • Как перемещать каталоги на основе вывода крупицы (проверка CRC32 .sfv) с помощью bash / perl?
  • Удаленный telnet для перезагрузки модема не работает
  • Объединить документ PDF, но с условиями
  • 2 Solutions collect form web for “(Ill) Логическое утверждение”

    Ваши статусы не работают так, как вы думаете. Вы можете включить отладку для сценариев Bash, например, включив в себя set -x команд set -x а затем отключите его с помощью set +x .

    пример

    Поэтому мы сначала добавляем отладку следующим образом:

     #!/bin/bash ## DEBUG set -x xsetwacom --set 16 touch False .... 

    Затем я запускаю ваш скрипт, я назвал его ex.bash , поэтому я ex.bash его:

     $ ./ex.bash 

    Bash пытается выполнить эту строку:

     if [ "$istouch"=="off" ] 

    И из выхода мы видим, что Баш путается. Он работает со строкой 'xsetwacom --get 15 touch==off' .

     + '[' 'xsetwacom --get 15 touch==off' ']' 

    Аргументы к == не должны касаться этого. Баш, как известно, придирчив к таким вещам. Поэтому поставьте некоторое пространство до и после следующего:

      if [ "$istouch" == "off" ] elif [ "$istouch" == "on" ] 

    Итак, теперь это выглядит немного лучше:

     + '[' 'xsetwacom --get 15 touch' == off ']' + '[' 'xsetwacom --get 15 touch' == on ']' 

    Однако вы не хотите сравнивать movng $istouch , вы хотите сравнить результаты команды, которую представляет эта строка, поэтому измените верхнюю часть скрипта на это:

     .... xsetwacom --set 16 touch False istouch=$(xsetwacom --get 15 touch) if [ "$istouch" == "off" ] .... 

    Теперь мы запускаем команду xsetwacom и сохраняем результаты в $istouch . У меня нет этих устройств, поэтому я получаю сообщение о device 15 . Но вот что делает скрипт сейчас:

     ++ xsetwacom --get 15 touch + istouch='Cannot find device '\''15'\''.' + '[' 'Cannot find device '\''15'\''.' == off ']' + '[' 'Cannot find device '\''15'\''.' == on ']' 

    Надеюсь, это даст вам некоторое представление о:

    1. Как отладить ваш скрипт
    2. Лучшее понимание синтаксиса Bash

    Более глубокий взгляд на утверждения if

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

    пример

     $ [ "no"=="yes" ] && echo "they match" they match $ [ "notheydont"=="yes" ] && echo "they match" they match 

    Может показаться, что здесь происходит проверка равенства, но нет. [ some-string ] является короткой для [ -n some-string ] , это проверка на то , что некоторая строка является [n] на-пустой. Использование set -x показывает нам следующее:

     $ set -x; [ "notheydont"=="yes" ] && echo "they match"; set +x + '[' notheydont==yes ']' + echo 'they match' they match + set +x 

    Если мы поместим некоторое пространство между аргументами в проверку равенства:

     # fails $ set -x; [ "notheydont" == "yes" ] && echo "they match"; set +x + '[' notheydont == yes ']' + set +x # passes $ set -x; [ "yes" == "yes" ] && echo "they match"; set +x + set -x + '[' yes == yes ']' + echo 'they match' they match + set +x 

    Теперь он работает так, как ожидалось!

    замещать

     istouch='xsetwacom --get 15 touch' $istouch 

    с (обратите внимание на обратные кавычки):

     istouch=`xsetwacom --get 15 touch` 
    Linux и Unix - лучшая ОС в мире.