if(var1 var2 비교) "var1을 찾을 수 없음" 오류

if(var1 var2 비교) "var1을 찾을 수 없음" 오류

내 문제를 설명하는 간단한 bash를 찾았습니다.

  #!/bin/sh 
str1="Learn Bash"
str2="Learn Bash"

if (( "$str1" == "$str2" )); then
   echo "Both Strings are Equal."
else
   echo "Both Strings are not Equal."
fi 

결과 :

    if_equal.sh: 6: if_equal.sh: Learn Bash: not found

Both Strings are not Equal.

기본적으로 나는 awk의 결과를 float와 한 번 비교한 다음 사용자가 제공한 정수와 비교하기를 원하므로 언제 사용할 수 있습니까?

[ "$c" -gt "$o" ] 

하지만 부동 소수점에서는 작동하지 않으며 다음과 같이 세 번째 변수를 사용하여 반복할 수도 없습니다.

[ "$c" -gt "$o" ] && echo fine || [ "$b" -gt "$o" ] && echo better

모든 공백을 확인하고 ", [], (), (())를 사용하거나 사용하지 않고 시도했습니다. if에서 첫 번째 변수가 누락된 것을 발견한 이유를 찾을 수 없습니다. BTW, 내 스크립트는 파일을 생성합니다. 내가 실행하면서 "0.9500"

if (( "$c" > "0.9500" ))

어쩌면 해결책이 있을까요?

답변1

, 산술 평가 bash입니다 . -line 때문에 스크립트가 사용하는 셸인 셸 (( ... ))에서는 두 개의 중첩된 하위 셸로 해석될 가능성이 높습니다. 이것이 쉘을 사용하여 실행할 때 파일이 호출되는 이유입니다. 이는 비교 연산자가 아닌 I/O 리디렉션이며 명령으로 해석되므로 "찾을 수 없음" 오류 메시지가 발생합니다.sh#!0.9500(( "$c" > "0.9500" ))sh>$c

셸 에서 sh문자열을 비교하려면 다음을 사용하세요.

[ "$str1" = "$str2" ]

정수를 비교하려면 다음을 사용하십시오.

[ "$num1" -gt "$num2" ]

셸 에서는 bash위 구문을 사용할 수도 있지만 다음을 사용할 수도 있습니다.

[[ "$str1" == "$str2" ]]

두 문자열이 같은지 비교하고

(( num1 > num2 ))

두 정수를 비교합니다.

쉘에는 bash문자열 이외의 다른 방식으로 부동 소수점 숫자를 처리하는 기능이 없습니다.

쉘에서 부동 소수점 숫자를 비교하려면 awk.

if awk -v num1="$num1" -v num2="$num2" 'BEGIN { exit !(num1 > num2) }'
then
    printf '%s is greater than %s\n' "$num1" "$num2"
else
    printf '%s is not greater than %s\n' "$num1" "$num2"
fi

비교의 부울 결과를 !셸의 종료 상태로 변환하려면 반전해야 합니다.

관련된:

답변2

첫째, sh그것을 다루지 마십시오 (( … )). 를 사용할 수 있지만 bash이 경우에도 숫자 정수 표현식에서만 작동합니다. 이 답변의 뒷부분에서 sh호환되는 사용법을 참조하십시오 awk. 나는 당신이 스크립트를 스크립트로 설명했지만 그것을 제목 bash으로 사용했다는 것을 알았습니다. #!/bin/sh이 헤더는 스크립트를 sh약간 다른 구문을 사용하여 스크립트로 선언합니다.

당신이 사용하는 경우bashman bash문서()에서 검색 해야 합니다 (즉 , 호출기에 필요한 경우 ((대괄호를 이스케이프해야 할 수도 있습니다 ). \(\(이 텍스트를 찾을 수 있습니다.

((expression))표현식은 아래 설명된 규칙에 따라 평가됩니다.산술 평가.

아래로 검색 ARITHMETIC EVALUATION하면 이 글을 읽게 될 것입니다(필자의 강조).

산술 평가쉘을 사용하면 특정 상황에서 산술 표현식을 평가할 수 있습니다( let내장 declare명령, ((복합 명령 및 산술 확장 참조).평가는 고정 너비 정수로 수행되며 오버플로 검사는 없습니다.[...]

이것이 말해주는 것은 (( … ))구성이 평가할 수 있다는 것입니다.정수 연산. 문자열이나 부동 소수점 연산에서는 작동하지 않습니다.

이제 계속해서 sh또는 bash.

[ … ]문자열을 사용하거나 처리 할 수 있습니다 [[ … ]].

if [[ "$str1" == "$str2" ]] …    # bash

또는

if [ "$str1" = "$str2" ] …       # POSIX including sh, and bash

부동 소수점 연산은 더 어렵습니다. 종료하거나 bcawk작업을 수행해야 합니다(제가 선호하는 방법은 입니다 awk).

a=12.34 b=5.678    # These are strings

# You cannot compare them as integers, because they're floats
if [[ "$a" -gt "$b" ]]; then echo yes; else echo no; fi
-bash: [[: 12.34: syntax error: invalid arithmetic operator (error token is ".34")

# You can use awk though
if awk -v a="$a" -v b="$b" 'BEGIN { exit !(a > b) }'; then echo yes; else echo no; fi
yes

awk여기서는 두 개의 변수 asum 을 할당합니다 b. awk읽기를 시작하기 전에표준 입력이를 숫자와 비교하고 >/에 해당하는 상태로 종료됩니다. 이 종료 상태는 쉘 구성에 의해 평소와 같이 처리됩니다.truefalseawkif … then … else … fi

관련 정보