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