(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 

  • Передача значений в скрипт
  • Как определить, какое устройство было недавно создано pppd?
  • Нужна помощь с сценарием командной строки сетевого администратора
  • Запустить скрипт на нескольких хостах
  • Не удается запустить удаленный скрипт через скрипт bash, но может через терминал
  • Как эффективно использовать сценарии bash (разные затраты на восстановление и хорошие привычки)?
  • эта команда работает, но когда я использую ее в цикле for, это не
  • Описание mpack (-d) из переменной скрипта
  • 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` 
    Interesting Posts

    Неправильная файловая система NFS

    Восстановить VG после добавления дисков и перезагрузки

    выражение grep, чтобы найти число

    Почему mv не может сохранять разрешения при переходе между SD-картами Android?

    Каким образом можно фильтровать текстовый файл для удаления пустых строк?

    добавление столбца в файл CSV с использованием awk

    Начало процесса при запуске

    Почему у Vim разные позиции курсора для разных режимов?

    «Каталог исходного кода ядра Linux», запрошенный в Cisco VPN client install

    Почему этот двоичный файл передается поверх «ssh -t», который изменяется?

    Простой способ посмотреть, кто в данный момент подключен к моей точке доступа. Linux Network-manger или nmcli

    Синтаксическая ошибка при попытке установить петлю оболочки nohup

    Активировать команды PHP при входе в систему

    Как определить псевдоним для неинтерактивной / недействительной оболочки?

    Как подтвердить / подтвердить Wi-Fi WPA2?

    Linux и Unix - лучшая ОС в мире.