이 스크립트가 이미 있지만 작동하지 않습니다. 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
이 문제를 어떻게 해결할 수 있나요?
답변1
이 스크립트에는 몇 가지 문제가 있습니다.
bash
test
테스트는 ,[ .. ]
또는 으로 수행하여 서브쉘을 나타낼 수 있습니다[[ .. ]]
.(
)
x = 1920
공백 없이 할당하면 매개변수 및 가 포함된 명령이 호출됩니다 . 대신 사용하세요.x
=
1920
x=1920
변수 이름 앞에는 달러 기호가 붙어야 합니다. 그래서
== x
그것은 나쁘기도 하고== $x
좋은 것이기도 하다. (산술 평가 또는 확장 제외:(( ... ))
또는$(( ... ))
, 의견을 보내 주셔서 감사합니다.선행은 이루기가 어렵다).-eq
=
문자열 비교를 위해서는 숫자를 , 와 비교해야 합니다 . 귀하의 경우에도 숫자가 동일한 방식으로 저장되므로 잘 작동하지만 개념적으로 올바른 연산자를 사용하는 것이 더 좋습니다.==
비표준 등가물입니다=
.변수를 인용할 때 가능하면 큰따옴표를 사용하는 데 익숙해져야 합니다. 예를 들어 이렇게 하면 와일드카드를 사용할 수 없습니다.
에서 시작하는 줄을 수정하겠습니다 x = 1920
. 수정된 버전은 다음과 같습니다.
x=1920
if [ "$WIDTH" -eq "$x" ]
then
wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz
else
xdotool key Ctrl+F12
fi
답변2
다른 답변에서 지적했듯이 (...)
서브 쉘을 나타냅니다. 산술 확장을 사용할 수 ((...))
있으므로 OR 또는 POSIXly를 bash
사용해야 합니다 . 다음과 같이 사용할 수 있습니다 .((...))
[[
[
((
$ 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이 아닌 것은 실패를 나타내는 일반적인 셸 방식과 반대).
답변3
if(a == b)
정수 비교에 대한 올바른 구문이 아닙니다. 또한 변수임을 표시하지 않고 호출하므로 x
값을 리터럴 string 과 $WIDTH
비교 하려고 합니다 x
. 다음으로 변경해 보세요.
if [[ $WIDTH -eq $x ]]
답변4
이 시도:
# 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
설명하다:
- , 예를 들어 no 와 같이 할당할 때
bash
공백을 추가하지 마십시오 .=
x=123
x = 123
- 의 내용을 비교하려면
bash
를 사용하세요[[ .. ]]
. xdotool
이미 프로그래밍getwindowgeometry --shell
에 사용되었습니다bash
.