Bash에서 숫자를 비교하는 방법은 무엇입니까?

Bash에서 숫자를 비교하는 방법은 무엇입니까?

이 스크립트가 이미 있지만 작동하지 않습니다. 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

이 스크립트에는 몇 가지 문제가 있습니다.

  • bashtest테스트는 , [ .. ]또는 으로 수행하여 서브쉘을 나타낼 수 있습니다 [[ .. ]].()

  • x = 1920공백 없이 할당하면 매개변수 및 가 포함된 명령이 호출됩니다 . 대신 사용하세요.x=1920x=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

설명하다:

  1. , 예를 들어 no 와 같이 할당할 때 bash공백을 추가하지 마십시오 .=x=123x = 123
  2. 의 내용을 비교하려면 bash를 사용하세요 [[ .. ]].
  3. xdotool이미 프로그래밍 getwindowgeometry --shell에 사용되었습니다 bash.

관련 정보