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


14

나는 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에 있습니다. 다른 정보가 여기에 있는지 모르겠습니다.


16
함께 <작동, 당신은 반면, 문자열 비교를하고 있습니다 -lt연산자는 숫자 비교가 목록에 추가 한 결과를 보면, 당신이 그것을 알게 될 것이다. 숫자 2는 알파벳 순서로 10보다 작습니다.
MelBurslan

답변:


51

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

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

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


35
다시 말해, 버그를 발견했다고 가정하기 전에 매뉴얼 페이지읽으십시오 . ;)
와일드 카드

진실. 아마도 내가 처음에 작업했던 스크립트는 실제로이 동작을 발견했을 때 실제로 '정확하게'([[$ myvar <13]] 실패와 같이) 작동하기 시작했습니다. 이 질문에 지금해야 할 일이 있습니까? 이 사이트에서 제목이 [해결됨] 등을 포함하도록 변경됩니까? 제목을 좀 더 설명적인 것으로 바꾸어야합니까?
달팽이에 퀘스트

2
아니요, 질문 제목을 변경하지 마십시오. 이 답변 옆의 확인 표시는 질문이 해결되었음을 나타내기에 충분합니다.
saiarcot895

14
@Wildcard OP는 버그를 발견했다고 가정하지 않습니다. 그들은 아마도 행동을 변화시키기 위해 무언가를했다고 제안합니다. 제목조차도 많이 가정합니다!
jpmc26 2016 년

5

어때요?

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


2
당신은 질문의 요점을 놓치고 있습니다- "그 값들을 어떻게 비교할 수 있습니까?" 그러나 "왜 그렇게 하는가?"
guntbert

7
이것은 이미 답변되었습니다. 그러나 그가 산술 표현식을 사용하고 싶었을 때 쉘에서 사용할 수있는 구문이 있음을 지적하는 것이 좋습니다.
PaulSmecker

3

첫째, [[ 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.