(질병) 논리적 진술

(질병) 논리적 진술

컴퓨터 화면을 뒤집는 간단한 스크립트를 만들려고 합니다. 첫 번째 if 문은 완벽하게 실행되지만 그 이후 $istouch가 "on"이라고 가정하면 elif 블록이 실행되지 않습니다! 실패 없이 -u 옵션을 사용하여 bash를 실행해 보았고 검사 전환을 시도했지만 아무것도 작동하지 않았습니다.

#!/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

답변1

당신의 if진술은 당신이 생각했던 대로 진행되지 않았습니다. 이 명령을 포함하여 Bash 스크립트에 대한 디버깅을 켠 set -x다음 를 사용하여 끌 수 있습니다 set +x.

따라서 먼저 다음과 같이 디버깅을 추가합니다.

#!/bin/bash

## DEBUG
set -x
xsetwacom --set 16 touch False
....

그런 다음 스크립트를 실행하고 ex.bash이를 다음과 같이 호출합니다.

$ ./ex.bash

Bash는 다음 줄을 실행하려고 합니다:

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

출력에서 Bash가 혼란스러워졌음을 알 수 있습니다. 문자열과 함께 작동합니다 'xsetwacom --get 15 touch==off'.

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

논쟁은 ==이런 식으로 다루어서는 안됩니다. Bash는 그런 것들에 대해 까다롭기로 악명 높습니다. 따라서 다음과 같이 앞뒤에 공백을 두십시오.

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

이제 조금 더 좋아 보입니다.

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

그러나 Stirng s를 비교하고 싶지 않고 $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 문이 해당 then섹션에 속한다는 것입니다.

$ [ "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

이제 예상대로 작동합니다!

답변2

바꾸다

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

AND(백틱에 주의하세요):

istouch=`xsetwacom --get 15 touch`

관련 정보