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 

어떻게 해결할 수 있습니까?

댓글

  • 적절한 숫자 비교 사용--eq (동일한 경우 등)
  • ' 하나 또는 여러 개의 답변에 만족하면 찬성합니다. 문제를 해결하는 중이라면 수락 이 " 감사합니다! " 답변을 수락하면 미래 독자에게 답변이 실제로 문제를 해결했음을 나타냅니다.

답변

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

  • 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 

    설명 :

    1. bash에 공백을 넣지 마십시오. = 값 할당; 예 : x = 123가 아닌 x=123.
    2. bash, [[ .. ]]를 사용합니다.
    3. xdotool에는 이미 getwindowgeometry --shell가 있습니다. bash 프로그래밍.

    댓글

    • -1 | eval` 불필요하게

    사용하셨습니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다