이 스크립트를 받았지만 작동하지 않습니다. if 문에서 숫자 비교를 평가하지 못했기 때문이라고 생각합니다.
#!/bin/bash { read __ WIDTH; read __ HEIGHT; read __ __ BORDER_WIDTH; } < <(xwininfo -id "$(xdotool getactivewindow)" | grep -o -e "Height:.*" -e "Width:.*" -e "Border width:.*") echo "Height: $HEIGHT, Width: $WIDTH, Border width: $BORDER_WIDTH" x = 1920 if($WIDTH == x) then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi
어떻게 해결할 수 있습니까?
댓글
답변
스크립트에 몇 가지 문제가 있습니다.
-
bash
테스트가 완료되었습니다.test
,[ .. ]
또는[[ .. ]]
사용(
..)
는 하위 셸을 의미합니다. -
할당은 공백없이 이루어집니다.
x = 1920
는=
및 iv id = “e62778bbb6 매개 변수를 사용하여x
명령을 호출합니다. “>
. 대신 x=1920
를 사용하세요.
변수 이름을 사용할 때는 달러 기호를 앞에 붙여야합니다. 따라서 == x
는 나쁘고 == $x
는 좋습니다. (산술 평가 또는 확장 제외 : (( ... ))
또는 $(( ... ))
, 의 댓글 덕분에 Kusalananda ).
숫자는 -eq
, =
는 문자열 비교를위한 것입니다. 귀하의 경우에는 숫자가 동일하게 저장 될 가능성이 높기 때문에 작동해야하지만 개념적으로 올바른 연산자를 사용하는 것이 좋습니다. ==
는
.
가능하면 모든 곳에서 변수를 이중 인용하는 데 익숙해 져야합니다. 예를 들어 globbing을 방지합니다.
x = 1920
에서 시작하는 줄을 수정하겠습니다. 수정 된 버전은 다음과 같습니다.
x=1920 if [ "$WIDTH" -eq "$x" ] then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi
댓글
- 세 번째 요점 : 산술 평가 또는 확장 제외 :
(( ... ))
또는$(( ... ))
.
답변
다른 답변에서 언급했듯이 (...)
는 서브 쉘을 나타냅니다. 산술 확장은 ((...))
이므로 bash
의 경우 ((...))
또는 [[
또는 POSIXly [
. ((
는 다음과 같이 사용할 수 있습니다.
$ if ((1==1)); then echo "YES" ;fi YES
그러나 [[
, ==
연산자는 패턴 일치를 나타냅니다. 즉, 산술 비교가 아닙니다.
또는 POSIX 셸에서 ==
연산자를 실제로 사용하려면 다음을 수행 할 수 있습니다.
$ foo=1 $ bar=2 $ if [ $((foo==bar)) -eq 1 ]; then echo "YES"; else echo "NO"; fi NO $ bar=1 $ if [ $((foo==bar)) -eq 1 ]; then echo "YES"; else echo "NO"; fi YES
POSIX 셸 /bin/sh
의 경우 ((
연산자는 없지만 $((
: 산술 표현식의 결과로 확장됩니다. 그 안의 비교 연산자는 C와 같은 방식으로 작동합니다. 여기서 1은 실제 결과를 나타내고 0은 잘못된 결과를 나타냅니다 (일반적인 쉘 방식과 반대). , 여기서 0은 성공이고 0이 아닌 것은 실패입니다.)
답변
if(a == b)
는 정수 비교를위한 적절한 구문이 아닙니다. 또한 변수임을 나타내지 않고 x
를 호출하므로 $WIDTH
리터럴 문자열 x
. 대신 시도해보세요.
if [[ $WIDTH -eq $x ]]
댓글
- 변수를 인용합니다.
x
에 대한 할당도 버그가 있습니다. -
[[ [...] ]]
구문에서 변수를 인용 할 때 ' 필요하지 않습니다. 내가 '하지 않으면해야한다는 말을받습니다. 이길 수 없습니다. - -1 | 필요하지 않은 경우
[[ .. ]]
를 사용했습니다. 이러한 경우에는 일반적인 테스트 명령을 사용해야합니다. - @Vlastimil 무엇을 위해? 이것은 bash 스크립트입니다. '
[
를 사용할 이유가 전혀 없습니다. - '
bash
를 사용하고 있습니다. 문자 그대로 하위 집합이면서 더 자주 발생하는[ [...] ]
구조를 사용할 이유가 없습니다. PICNIC 문제로 인한 실패.
답변
시도 :
# use xrandr+sed to get current screen width screenWidth=`xrandr|sed -En "/connected [0-9]+x[0-9]+/{s/^.*connected ([0-9]+)x[0-9]+.*$/\1/;p}"` # use xdotool getwindowgeometry --shell to get size/pos of window eval `xdotool getactivewindow getwindowgeometry --shell` echo $screenWidth $WIDTH # debug, to see values got from xrandr and xdotool if [[ $WIDTH = $screenWidth ]]; then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi
설명 :
-
bash
에 공백을 넣지 마십시오.=
값 할당; 예 :x = 123
가 아닌x=123
. -
bash
,[[ .. ]]
를 사용합니다. -
xdotool
에는 이미getwindowgeometry --shell
가 있습니다.bash
프로그래밍.
댓글
- -1 |
eval
및`
불필요하게
사용하셨습니다.
-eq
(동일한 경우 등)