'>'와 '-gt'의 차이점

'>'와 '-gt'의 차이점

이들의 차이점은 무엇입니까?

SEC=$(mysql -hxxx -Pxxx -uxxx -pxxx -se "SELECT Seconds FROM tablename")

SEC=100

둘 다 동일한 결과(100)를 반환합니다. 하지만 내가 테스트할 때:

if [ ${SEC} > 1 ]
then
    echo "SEC GT 1"
else
    echo "SEC LT 1"
fi

첫 번째는 다음을 반환합니다.

"SEC GT 1"

두 번째는 다음을 반환합니다.

"SEC LT 1"

그러나 다음과 같이 변경합니다.

if [ ${SEC} -gt 1 ]

그러면 결과가 반전됩니다.

나는 그것이 데이터 유형과 관련이 있다고 가정하고 있으며 아마도 cast동일한 결과를 얻으려면 둘 중 하나가 필요할 것입니다.

IF매번 섹션을 변경해야 한다는 것을 기억해야 하기 때문에 지금은 테스트를 엉망으로 만들고 있습니다 .

답변1

원래 는 끝에 추가 인수가 있어야 한다는 점을 제외 [하고는 일반 명령으로 구현되었습니다 . (여전히 일반 명령으로 존재하지만 대부분의 쉘에는 해당 명령이 내장되어 있습니다.) 일반 구문 분석이 적용되는 일반 명령이므로 수학 연산자를 사용할 수 없으며 인용 없이는 사용할 수 없습니다. 리디렉션 연산자가 포함되어 있으므로 동일합니다. 로 , 명령의 (빈) 출력을 이라는 파일로 리디렉션합니다 . 이 명령은 대부분 대시로 시작하는 특수 옵션을 만드는 일반적인 규칙을 따릅니다. 대부분의 연산자는 대시로 시작합니다. 따라서 파일을 읽을 수 있는지 테스트하고, 두 테스트를 “and” 연산자와 결합하고, and 가 같은지 테스트하는 등 의 작업이 있습니다 .test[]<>[ ${SEC} > 1 ][ ${SEC} ] >1[1[[ -r foo ][ -r foo -a -w bar ][ $x -eq $y ]$x$y

이러한 오래된 쉘에는 문자열 동일성( =대시 문자 규칙에서 벗어나는 몇 안되는 연산자 중 하나)이 있지만 문자열 순서는 없습니다.1. 예를 들어 [ $x -le $y ]정수가 $x보다 작거나 같은지 테스트하기 위해 수치 비교가 있었고, $y이 연산자 세트에는 선행 0이 숫자가 8진수임을 의미하기 때문에 [ $x -eq $y ]수치 적 동등성이 포함됩니다.[ 010 -eq 8 ]

[[ … ]]Ksh는 이제 bash 및 zsh에서도 사용할 수 있는 구문을 도입했습니다 . [ … ]일반 명령인 와 달리 쉘의 구문 분석기에 의해 인식되므로 및 [[ … ]]같은 특수 문자는 인용 없이 내부에서 사용할 수 있습니다(실제로 인용해서는 안 됩니다). 이후 와 친구들은 이미 수치 비교가 가능했고 이미 문자열 비교를 하고 있었고 친구들은 문자열 비교 연산자(사전순)로 만들어졌습니다. 예를 들어, 그러나 .(<-lt=<[ 9 -lt 10 ][[ 10 < 9 ]]

¹ 유틸리티를 통해 문자열 순서를 지정할 수 있습니다 expr. 이는 exprPOSIX 쉘의 기능에 포함되지 않은 몇 가지 용도 중 하나입니다 . 그러나 expr문자열과 숫자 비교에 동일한 연산자를 사용하므로 주의 expr 9 \< 10하세요 expr a9 \> a10.
² 문자열이 바이트 문자열로 해석되는지, 아니면 현재 로케일의 문자열로 해석되는지는 쉘에 따라 다릅니다.

관련 정보