bash에서 "-ne"은 무슨 뜻입니까?
bash 스크립트에서 "-ne" 명령어는 무엇을 의미합니까?
예를 들어 bash 스크립트의 다음 행은 무엇을 합니까?
[ $RESULT -ne 0 ]
아직 어디를 찾아야 할지 모르는 경우 검색하기 어려운 항목 중 하나입니다.
[
는 실제로는 명령어이며 예상대로 bash 셸 구문의 일부가 아닙니다.이 명령어는 Bash에 내장되어 있기 때문에 Bash 매뉴얼에 기재되어 있습니다.
또, 많은 시스템에서는, GNU Coreutils 패키지에 의해서 제공되고 있습니다.
[
말은 '이렇게 하다'에합니다.test
,[
에는 「」가 필요합니다.]
test
지지않않않않
되어 있는 bash를 info bash
'test'
★★★★★★★★★★★★★★★★★」'['
입니다), (아포스트로피도 검색의 일부입니다)에[
「」( 「」)라고도 .test
명령어를 입력합니다.「 」를 사용하고 man bash
info bash
, 검색, .^ *test
)test
행의 선두에, 몇개의 공백 뒤에 표시됩니다).
'하면 'Bash 조건식'에 설명이 .-ne
이는 숫자 부등식 연산자("ne"는 "같지 않음"을 나타냅니다. by by by by by!=
문자열 부등식 연산자입니다.
웹에서도 bash 문서를 찾을 수 있습니다.
- Bash 참조
- Bourne 쉘 내장 (포함)
test
★★★★★★★★★★★★★★★★★」[
) - Bash 조건식 -- (아래로 스크롤;
-ne
arg1 OP arg2 아래에 있음) - 의 POSIX
test
의 공식 정의test
포식스확장기능도 있습니다.
않다' 에는 '같지 않다'라고 합니다.$RESULT
0으로 하다
단, 테스트는 알파벳순이 아닌 숫자로 수행됩니다.
n1 -ne n2 True if the integers n1 and n2 are not algebraically equal.
비교:
s1 != s2 True if the strings s1 and s2 are not identical.
이전 답변에 컨텍스트 추가
몇 년 전에 BaaS에서 프로그래밍을 시작한 이후로, 나는 아직도 수학 연산자에 대한 주제를 기억하기가 혼란스럽다.BaaS는 많은 기이한 점 때문에 프로그래밍을 하기가 어렵습니다.다른 기본 피연산자(예: 보다 작거나 큰 등)와 비교할 때 완전히 다른 기술이 필요하기 때문에 정수를 포함하는 변수의 등/비등 비교를 코드화하는 것이 고전적인 예이다.를 들어, 「」등).((..))
를 등식 또는 를 등식 또는 비등식 수식에 적용하면 올바르게 동작하지 않습니다.
OP의 질문에 따라 BaaS에서 두 정수의 숫자 비교를 어떻게 코드화할 수 있는지, 그리고 어떤 방법이 효과가 있는지, 어떤 방법이 효과가 있는지를 예를 들어 설명하겠습니다.내 코멘트는 동일/비동일한 논리로만 제한합니다.
기본 번호 체계를 언급하지 않고는 이 주제에 대해 충분히 논의할 수 없다.BaaS 문서는 종종 진흙처럼 명확합니다.예를 들어, 일부 상황에서는 BaaS가 정수를 8진수(8진수)로 가정하는 반면, 대부분의 사람은 10진수(10진수)로 가정한다.예기치 않은 결과로 인해 나중에 디버깅할 때까지 숫자 비교를 사용하여 스크립트를 프로그래밍할 때 문제가 발생했음을 깨닫지 못할 수 있습니다.BaaS의 동작이 일관되지 않는 것처럼 보일 수 있지만, 실제로는 BaaS가 문자열과 숫자를 어떻게 해석하는지를 완전히 이해하는 것에 불과합니다.
선행 0이 없는 정수를 비교합니다.
비교할 정수의 선행 0이 없는 것이 확실한 경우 다음 방법 중 하나를 사용할 수 있습니다.
#/bin/bash
a=4
b=4
printf "method 1: "; if [ $a != $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 2: "; if [ "$a" != "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 3: "; if [ $a -ne $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 4: "; if [ "$a" -ne "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 5: "; if (( a != b )); then printf "not equal"; else printf "equal"; fi; printf "\n"
정수와 선행 0을 비교합니다.
이제 선행 0이 있는 변수가 하나 이상 있다고 가정해 보겠습니다.이 경우 일부 메서드가 올바르게 작동하지 않습니다(오류가 생성되거나 잘못된 결과가 반환됩니다).이는 BaaS가 숫자 값을 문자열로 해석하고 두 숫자를 문자열로 비교하기 때문이거나 BaaS가 값이 8베이스 정수일 것으로 예상하여 8진수 체계에서 해석할 수 없는 문자를 발견했기 때문입니다.
이러한 문제를 해결하는 방법은 다양하지만, 가장 쉬운 방법은 정수를 비교하는 데 특정 기술을 사용하지 않는 것입니다.
이러한 방법은 실제 값을 비교하려고 할 때 작동하지 않습니다."같지 않은" 결과가 잘못 반환됩니다.물론 실제로 리터럴 문자열을 비교하고 싶다면 바람직한 결과가 될 수 있으므로 실제로 사용 사례에 따라 달라집니다.어느 쪽이든, 요점은 이 공식들이 "x" 대 "0x"를 동일하지 않은 것으로 간주한다는 것입니다. 비록 인간에게는 같은 수치이긴 하지만 말입니다.
몇 가지 예를 들어 보겠습니다.
정수, 선행 0은 없습니다.이러한 공식은 모두 유효합니다.
#!/bin/bash
a=7
b=7
printf "method 1: "; if [ $a != $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 2: "; if [ "$a" != "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 3: "; if [ $a -ne $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 4: "; if [ "$a" -ne "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 5: "; if (( a != b )); then printf "not equal"; else printf "equal"; fi; printf "\n"
Output:
method 1: equal
method 2: equal
method 3: equal
method 4: equal
method 5: equal
이쪽도 마찬가지입니다.외관상으로는 문제가 없습니다.
#!/bin/bash
a=7
b=8
printf "method 1: "; if [ $a != $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 2: "; if [ "$a" != "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 3: "; if [ $a -ne $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 4: "; if [ "$a" -ne "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 5: "; if (( a != b )); then printf "not equal"; else printf "equal"; fi; printf "\n"
Output:
method 1: not equal
method 2: not equal
method 3: not equal
method 4: not equal
method 5: not equal
선행 0이 도입되면 문제가 발생할 수 있습니다.
#!/bin/bash
a=04
b=4
printf "method 1: "; if [ $a != $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 2: "; if [ "$a" != "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 3: "; if [ $a -ne $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 4: "; if [ "$a" -ne "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 5: "; if (( a != b )); then printf "not equal"; else printf "equal"; fi; printf "\n"
Output:
method 1: not equal
method 2: not equal
method 3: equal
method 4: equal
method 5: equal
위의 예에서는 출력 결과에 일관성이 없습니다.이는 처음 두 가지 방법이 $a와 $a를 비교하기 때문입니다.$b를 문자열로 지정합니다.즉, 그 내용은 문자 그대로 비교됩니다.한편, 세 번째에서 다섯 번째 방법은 $a와 $b를 수치로 변환한 후 비교하기 때문에, 그것들은 정상적으로 동작하고 있는 것 같습니다.그러나 언급할 가치가 있는 또 다른 문제가 있는 시나리오가 있다.
다섯 번째 방법은 일반적으로 피해야 한다.
#!/bin/bash
a=8
b=08
printf "method 1: "; if [ $a != $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 2: "; if [ "$a" != "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 3: "; if [ $a -ne $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 4: "; if [ "$a" -ne "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 5: "; if (( a != b )); then printf "not equal"; else printf "equal"; fi; printf "\n"
Output:
method 1: not equal
method 2: not equal
method 3: equal
method 4: equal
method 5: main.sh: line 8: ((: 08: value too great for base (error token is "08")
equal
위에서 알 수 있듯이 첫 번째 두 메서드는 두 값을 문자열로 비교하기 때문에 FALSE(같지 않음) 비교 결과를 반환합니다.더 중요한 것은 다섯 번째 방법에서 오류가 발생하는데, 이는 BaaS가 8진수를 예상하고 있으며 0으로 시작할 때 0이 아닌 값으로 무엇을 해야 할지 모르기 때문입니다.이 방법의 또 다른 과제는 다음과 같이 오류 메시지를 억제해도 올바른 결과인지 여부에 관계없이 매번 FALSE 결과가 반환된다는 것입니다.
#!/bin/bash
a=8
b=09
printf "method 1: "; if [ $a != $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 2: "; if [ "$a" != "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 3: "; if [ $a -ne $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 4: "; if [ "$a" -ne "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 5: "; if (( a != b )); then printf "not equal"; else printf "equal"; fi; printf "\n"
Output:
method 1: not equal
method 2: not equal
method 3: not equal
method 4: not equal
method 5: main.sh: line 8: ((: 09: value too great for base (error token is "09")
equal
다섯 번째 방법의 이 변형도 제대로 작동하지 않는다는 점도 언급할 필요가 있습니다.
printf "method 5: "; if (( $a != $b )); then printf "not equal"; else printf "equal"; fi; printf "\n"
이것도 아닙니다.
printf "method 5: "; if (( "$a" != "$b" )); then printf "not equal"; else printf "equal"; fi; printf "\n"
결산
결론은 BaaS에서 두 정수를 비교할 때 일반적으로 이러한 유형의 공식식을 사용해야 하며, 언급된 다른 정수는 사용하지 않아야 한다는 것입니다.이 경우 두 개의 10-염기 정수를 같거나 같지 않은 연산자를 사용하여 서로 비교해야 한다고 가정합니다.
printf "method 3: "; if [ $a -ne $b ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
printf "method 4: "; if [ "$a" -ne "$b" ]; then printf "not equal"; else printf "equal"; fi; printf "\n"
정수를 동등하게 비교할 때도 같은 논리가 적용됩니다.
printf "method 3: "; if [ $a -eq $b ]; then printf "equal"; else printf "not equal"; fi; printf "\n"
printf "method 4: "; if [ "$a" -eq "$b" ]; then printf "equal"; else printf "not equal"; fi; printf "\n"
언급URL : https://stackoverflow.com/questions/17689511/what-does-ne-mean-in-bash
'sourcecode' 카테고리의 다른 글
C#에서 FindTimeZoneById()와 함께 사용하는 시간대 ID 목록? (0) | 2023.04.18 |
---|---|
select 문의 Datetime 열을 UTC에서 로컬 시간으로 변환 (0) | 2023.04.18 |
날짜 문자열에 대한 Oracle to_date 함수 사용(밀리초) (0) | 2023.04.18 |
SQL Server가 대소문자를 무시하는 식입니다. (0) | 2023.04.13 |
TypeError를 극복하는 방법: 캐시할 수 없는 유형: '리스트' (0) | 2023.04.13 |