[unix] 강타 : 나는 파산했다 [[<]]

나는 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

변경 <-lt스크립트의 정상적인 출력 (범 5 10방송 예컨대 업).

재부팅해도 아무런 변화가 없었습니다.

내 bash 버전은 GNU bash 버전 4.3.42 (1)-릴리스 (x86_64-pc-linux-gnu)입니다. 우분투 15.10에 있습니다. 다른 정보가 여기에 있는지 모르겠습니다.



답변

로부터 bash매뉴얼 페이지를 참조하십시오.

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

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


답변

어때요?

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 ++)).


답변

첫째, [[ POSIX가 아니므 로 피해야합니다.

둘째, <산술 테스트의 일부로 사용하려면 다른 구문 으로이 작업을 수행 할 수 있습니다.

if [ $((2 < 13)) = 1 ]
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


답변