(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 

  • Как использовать GNU Parallel для этого цикла while?
  • Как запустить интерактивные команды, как другого пользователя
  • как использовать grep -v в сценарии ожидания
  • bash: ожидается целочисленное выражение
  • Когда «если» не нужно?
  • скрипт, в котором перечислены все файлы в каталоге и подкаталогах, отсортированных по размеру, перечисляя только имена файлов, а не полные пути
  • Ошибка при запуске скрипта Python с использованием cron
  • Открыть запуск через оболочку / скрипт
  • 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 - лучшая ОС в мире.