컴퓨터 화면을 뒤집는 간단한 스크립트를 만들려고 합니다. 첫 번째 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 ']'
이를 통해 다음에 대한 통찰력을 얻을 수 있기를 바랍니다.
- 스크립트를 디버깅하는 방법
- 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`