Bash에서 비교 연산자를 사용하는 방법은 무엇입니까? [복사]

Bash에서 비교 연산자를 사용하는 방법은 무엇입니까? [복사]

Bash에서 <=, >=및 사용 방법은 무엇입니까 >?<

바꾸다:

if [[ $arg1 -ge $num1 && $arg2 -le $num2 ]]; then
     ...
fi

다음과 같은 것들이 더 있습니다:

if [[ $arg1 >= $num1 && $arg2 <= $num2 ]]; then
     ...
fi

답변1

구체적으로 bash:

  • ((arg1 >= num1))(에서 상속됨 ksh) 산술 비교를 수행합니다. arg1이는 num1동일한 이름을 가진 쉘 변수를 참조합니다. 각 변수는 산술 확장으로 해석되고 결과가 대체됩니다. 여기서 $arg1is 010$num1is 이면 4+5결과는 다음과 같습니다.잘못된( ((...))명령은 0이 아닌 종료 상태로 반환됩니다.) 0108은 8진수이고 4+59는 8진수이기 때문입니다.
  • (($arg1 >= $num1)): 전체 산술 표현식이 평가되기 전에 $arg1및 가 확장된다는 점을 제외하면 위와 동일합니다 . was 및 was $num1인 경우 및 자체가 유효한 표현식이 아니기 때문에 이전 명령이 실패합니다 . 하지만 여기서는 산술 표현식이 평가되므로 성공할 것입니다 . 일반적으로 산술식에서 는 생략하는 것이 가장 좋습니다. 예를 들어 .$arg1(2$num12)(22)(2 >= 2)$a=2+2; echo "$((3 * $a))"a=2+2; echo "$((3 * a))"
  • let "..."(또한 ksh에서). 이와 동일합니다. 단, ((...))일반 명령으로 구문 분석된다는 점만 제외하면 읽기 어렵고 이식성이 떨어지며 인용에 더 주의를 기울여야 합니다.
  • [ "$arg1" -ge "$num1" ]. 이것은 표준적이고 휴대 가능합니다. 10진수 상수만 지원됩니다. [ 010 -ge 9 ]동일합니다 [ 10 -ge 9 ].
  • [[ $arg1 -ge $num1 ]]. ksh에서도 사용되지만 큰 차이점이 있습니다. 이번에는 , $arg1및 가 $num1소수 상수가 아닌 산술식으로 처리됩니다. [[ 010 -ge 9 ]]다시 false를 반환합니다.
  • [[ $arg1 < $num1 ]]. 문자열 비교. 문자열을 비교하는 데 사용되므로 strcoll()로케일의 정렬 알고리즘을 사용합니다. 정렬 알고리즘을 사용하는 <경우 / 는 바이트 간 비교를 수행하므로 및 /가 false를 반환하는 모든 문자열 쌍이 있을 수 있습니다 . 지원되지 않습니다.>===<>===<=>=
  • [ "$arg1" "<" "$num1" ]. 비표준. 위와 동일하지만 [명령을 사용합니다. <리디렉션 연산자로 처리되지 않도록 인용해야 합니다.
  • expr " $arg1" "<=" " $num1" > /dev/nullexpr(어휘 비교를 강제하고 연산자처럼 보이는 문자열 문제를 방지하려면 공백을 포함하십시오 .) 또는 awk 'BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}' "$arg1" "$num1"를 사용하십시오 strcoll().

답변2

이러한 연산자는 예 (( ... ))$(( ... ))(산술 평가그리고산술 확장각기):

if (( arg1 >= num1 )) && (( arg2 <= num2 )); then
    ...
fi

또한 let다음은 위와 동일합니다.

if let "arg1 >= num1" && let "arg2 <= num2"; then
    ...
fi

Bash 매뉴얼의 "산술 평가" 섹션을 참조하세요.

관련 정보