<(보다 작음)이 bash [[ ]]에서 -lt와 다른 결과를 제공하는 이유는 무엇입니까?

<(보다 작음)이 bash [[ ]]에서 -lt와 다른 결과를 제공하는 이유는 무엇입니까?

bash 스크립트를 작성 중인데 갑자기 다음 동작이 발생합니다.

[[ 1 < 2 ]]; echo $?  # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1

하지만 -lt잘 작동합니다.

[[ 1 -lt 2 ]]; echo $?  # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0

실수로 덮어썼던 걸까요 <?

이 동작을 테스트하기 위해 작성한 스크립트는 다음과 같습니다.

#!/bin/bash

for a in {1..5}
do
    for b in {1..20}
    do
        [[ $a < $b ]] && echo $a $b
    done

    echo
done

출력은 다음과 같습니다.

1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20

2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 20

3 4
3 5
3 6
3 7
3 8
3 9

4 5
4 6
4 7
4 8
4 9

5 6
5 7
5 8
5 9

스크립트에서 이를 변경하면 <정상적인 출력(예: 디스플레이)이 제공됩니다.-lt5 10

다시 시작해도 아무것도 바뀌지 않았습니다.

내 bash 버전은 GNU bash 버전 4.3.42(1)-release(x86_64-pc-linux-gnu)입니다. 우분투 15.10을 사용하고 있습니다. 여기서 또 무슨 관련이 있는지 모르겠습니다.

답변1

bash맨 페이지 에서 .

[[와 함께 사용하면 <and >연산자는 현재 로케일을 사용하여 사전순으로 정렬합니다.

출력을 보면 설계된 대로 작동하는 것으로 보입니다.

배쉬에서 사용:

  • [[ $a < $b ]]현재 로케일을 기반으로 한 사전 비교( 사용 strcoll(3))
  • [ "$a" -lt "$b" ]십진 정수 비교에 사용됩니다.
  • (( a < b ))또는 [[ $a -lt $b ]]산술 표현식 비교를 위해. $a산술 표현식이 저장되고 평가되는 동안 임의의 명령을 실행하는 등 의 $b부작용이 있을 수 있습니다 . 예를 들어 시스템을 x=5 a='++x' bash -c '[[ $a -lt $a ]]; echo "$? $x"'내보내고 0 7다시 시작합니다(두 번). a='x[$(reboot)]' b=a bash -c '[[ $a -lt $b ]]'또한 0으로 시작하는 숫자는 10진수가 아닌 8진수로 해석됩니다.

답변2

어때요?

for a in {1..5}; 
do     
  for b in {1..20};     
  do         
    (( $a < $b )) && echo $a $b
  done      
  echo
done

~에 따르면http://www.tldp.org/LDP/abs/html/dblparens.html

let 명령과 마찬가지로 (( ... )) 구조는 산술 확장 및 평가를 허용합니다. 가장 간단한 형식에서 a=$(( 5 + 3 )) 는 a를 5 + 3 또는 8로 설정합니다. 그러나 이 이중 중괄호 구성은 Bash에서 C 스타일의 변수 조작을 허용하는 메커니즘이기도 합니다(예: (( var++ ))).

답변3

첫 번째,[[ POSIX 아님피해야한다.

<둘째, 산술 테스트의 일부로 사용하려면 다음과 같이 다른 구문을 사용하면 됩니다.

if [ "$((2 < 13))" -ne 0 ]
then
  echo '2 is less than 13'
else
  echo '2 is greater or equal to 13'
fi

또는:

if expr 2 '<' 13
then
  echo '2 is less than 13'
else
  echo '2 is greater or equal to 13'
fi

관련 정보