왜 우리는 비교할 수 없습니까? (점)을 if 문의 괄호 안의 문자열 값으로 사용하시겠습니까?

왜 우리는 비교할 수 없습니까? (점)을 if 문의 괄호 안의 문자열 값으로 사용하시겠습니까?

질문

"problem1.sh" 문자열을 그 자체와 비교해야 합니다. 그것은 잘 작동합니다solution1.sh (다음과 같다)비교를 위해 대괄호를 사용합니다. 단, 다음의 경우에는 작동하지 않습니다.solution2.sh (다음과 같다)여기서는 괄호를 사용합니다. 언급된 오류가 표시됩니다.(다음과 같다).

내가 이미 무엇을 시도했는가?

Bash 스크립트에서 대괄호와 둥근 괄호를 사용하는 것의 차이점을 이해하려고 합니다.여기그리고여기. 내가 아는 한 ((expression))문자열 값이 아닌 산술 값을 비교하는 데 사용됩니다.

그렇다면 문제의 원인은 무엇입니까?

문자열 "problem1.sh"에서 하위 문자열 ".sh"를 제거하고 동일한 명령문을 사용하여 비교하면 if (("problem1" == "problem1"))제대로 작동합니다. 그러나 문자열에 "."만 추가하면 문제가 발생합니다. "."를 제외한 모든 것을 제거하더라도 문자열과 명령문을 사용하면 if (("." == "."))오류가 표시됩니다.

그럼 내 질문은

명령문이 if (("problem1" == "problem1"))제대로 작동하는 경우(아마도 영어 알파벳의 모든 문자에 대해 작동할 것입니다), "." 문자열이 문제를 일으키는 이유는 무엇입니까? 내 말은, if (("." == "."))문자를 비교하기 위해 동일한 표현식(예를 들어)을 사용할 수 있는데 왜 bash 스크립트의 if 문에서 괄호(예를 들어)를 사용하여 비교할 수 없습니까 if (("findError" == "findError"))?

솔루션 1.sh

if [ "problem1.sh" == "problem1.sh" ]
then
        printf "Okay"   
fi

솔루션 2.sh

if (( "problem1.sh" == "problem1.sh" ))
then
        printf "Okay"   
fi

Solution2.sh에 대한 오류 메시지

./solution2.sh: line 1: ((: problem1.sh == problem1.sh : syntax error:
    invalid arithmetic operator (error token is ".sh == problem1.sh ")

답변1

언어 번역에 문제가 있습니다.
산술 표현식의 언어에서는 점이 존재하지 않습니다.

사용 중인 언어가 "$((…))" 내에서 작동하지 않습니다.

"$((...))"(산술 표현식) 내에는 숫자(일반적으로 와 같은 정수 1234), 연산자( +, -및 동등 연산자 *<<yes ==등) 및 변수(하나 이상의 문자, 숫자(첫 번째 문자 아님) 및 밑줄). 그게 다야. 그런 개념은 없어요.

이것을 산술 표현식으로 작성하면 problem1언어에서는 변수 이름(또는 이전에 정의되지 않은 경우 값 0)으로 이해됩니다.

$ echo "==$((problem1))=="
==0==

$ problem1=34
$ echo "==$((problem1))=="
==34==

텍스트가 따옴표 안에 있는지 여부는 중요하지 않습니다.

$ echo "==$(("problem1"))=="
==34==

당신이 사용하고 있는 것은 ((…))또한 출력이 없는 산술 표현식이기도 합니다. 그냥 설정해종료 상태(그리고 C에서와 같이 표현식이 다음과 같이 평가되면0이 아님).

$ (( 1 + 1 ))  ; echo "$?"
0
$ (( 0 ))      ; echo "$?"
1
$ (( 1 - 10 )) ; echo "$?"
0

그러나 산술 표현식은 점이 무엇인지, 즉 연산자나 변수 이름으로 이해하지 못하므로 구문 오류가 발생합니다.

$ echo "$(( 1.3 ))"
bash: 1.3 : syntax error: invalid arithmetic operator (error token is ".3 ")

problem1변수 이름( ) 뒤에 점이 온 다음 다른 변수 이름( ) 이 오는 경우에도 마찬가지입니다 sh.

$ echo "$((problem1.sh))"
bash: problem1.sh: syntax error: invalid arithmetic operator (error token is ".sh")

연산자가 +점이 아닌 경우 표현식이 작동합니다.

$ echo "$((problem1+sh))"
34

34로 설정한 경우 problem1(위와 같음)

그렇다면 비교할 수 있는 유일한 방법은사용하는 것입니다 [[…]]:

$ [[ problem1.sh == problem1.sh ]] && echo YES
YES

(이 특별한 경우에는 변수 확장이 없고 문자열에 전역 문자가 없기 때문에 문자열의 오른쪽을 인용하지 ==않지만 일반적으로 문자열의 오른쪽을 인용합니다 ==.)

또는 귀하가 작성한 것과 유사합니다.

if       [[ "problem1.sh" == "problem1.sh" ]]
then     printf "Okay"   
fi

답변2

예상할 수 있듯이 (( == ))는 두 숫자 값을 비교합니다. 하지만 (( ))에서는 편의상 변수 이름만 쓸 수도 있습니다. $VAR을 쓸 필요는 없고 VAR만 쓸 수도 있습니다.

또한 오류 메시지에는 따옴표가 포함되어 있지 않습니다. 나는 이것에 조금 놀랐다. 실제로는 그렇지 않습니다. 파서는 대체 항목이 있는지 확인하고 따옴표를 제거한 단어를 전달합니다.

그래도 나는 파서가 .;를 만날 때까지 문제1을 변수 이름으로 받아들이므로 ".sh"로 시작하는 이해하지 못하는 텍스트를 보고한다고 믿습니다.

관련 정보