((...)) 문자열 비교가 포함된 if 문이 bash 스크립트에서 작동하지 않습니다.

((...)) 문자열 비교가 포함된 if 문이 bash 스크립트에서 작동하지 않습니다.

나는 다음 스크립트를 작성했습니다.

#!/usr/bin/bash

STR_1="nfosys"
STR_2="Infosys"

if (( $STR_1 == $STR_2 ))
then
        echo "Strings are equal"
else
        echo "Strings are not equal"
fi

출력을 얻으십시오 :

root:~/Desktop/user_repo/Demo# bash -x test.sh 
+ STR_1=nfosys
+ STR_2=Infosys
+ ((  nfosys == Infosys  ))
+ echo 'Strings are equal'
Strings are equal
root:~/Desktop/user_repo/Demo# 

이상적으로는 "문자열이 동일하지 않음" 문을 인쇄해야 하지만 "문자열이 동일하지 않음"을 인쇄하는 이유를 이해할 수 없습니다.

답변1

(( .. ))산술 문맥에서 문자열이 변수의 이름으로 처리되고 해당 변수의 값이 사용되는 산술 구문입니다. 이는 $var확장 확장 후에 발생하므로 스크립트는 nfosys및 라는 변수를 확인합니다 Infosys. 두 변수 모두 설정되지 않으면 둘 다 0입니다. 즉, 같습니다. 하지만:

$ str1=foo str2=bar foo=1
$ (( $str1 == $str2 )) && echo true || echo false
false   

예를 들어 참조하십시오.Bash 쉘 산술 매뉴얼:

쉘 변수는 피연산자로 허용됩니다. 매개변수 확장은 표현식 평가 전에 수행됩니다. 표현식 내에서 쉘 변수는 매개변수 확장 구문을 사용하지 않고도 이름으로 참조될 수도 있습니다. null이거나 설정되지 않은 쉘 변수는 매개변수 확장 구문을 사용하지 않고 이름으로 참조할 때 0으로 평가됩니다.

문자열 비교의 경우 다음을 사용하십시오.

[ "$STR_1" = "$STR_2" ]   # in any POSIX shell, or

[[ $STR_1 = "$STR_2" ]]   # in Bash/ksh/zsh

이전의단어 분할에는 따옴표가 필요하기 때문에$STR_2, 후자는 패턴으로 간주되지 않도록 오른쪽(bash/ksh)에서만 필요합니다 .

또한보십시오:Bash 연산자 [[ vs [ vs ( vs ((?

답변2

대신 이를 사용하면 []원하는 동작이 생성됩니다.

STR_1="nfosys"
STR_2="Infosys"

if [ $STR_1 = $STR_2 ]
then
        echo "Strings are equal"
else
        echo "Strings are not equal"
fi

산출:

+ STR_1=nfosys
+ STR_2=Infosys
+ '[' nfosys = Infosys ']'
+ echo 'Strings are not equal'
Strings are not equal

경험상 좋은 규칙은 변수가 잘못 해석되거나 확장/분할될 경우를 대비해 변수도 인용하는 것입니다.

STR_1="nfosys"
STR_2="Infosys"

if [ "$STR_1" = "$STR_2" ]
then
        echo "Strings are equal"
else
        echo "Strings are not equal"
fi

또한 []POSIX를 고려하는 동안 [[]]주요 목표가 bash.

편집자 주: POSIX는 단일 =.

답변3

다들 감사 해요. 세션을 다시 시작하고 단일 대괄호로 변경했습니다.

#!/usr/bin/bash

STR_1="nfosys"
STR_2="Infosys"

if [ $STR_1 == $STR_2 ]
then
        echo "Strings are equal"
else
        echo "Strings are not equal"
fi

sh test.sh를 사용하여 실행하면 오류가 발생합니다.

root@ip:~# sh test.sh 
test.sh: 6: [: nfosys: unexpected operator
Strings are not equal
root@ip:~# bash test.sh 
Strings are not equal

bash로 실행하면 오류 없이 올바른 출력이 표시됩니다.

root@ip:~# bash test.sh 
Strings are not equal

이상한 점은 질문을 게시하기 전에 sh/bash와 ()/[]라는 두 가지 방법을 시도했다는 것입니다. 하지만 세션을 다시 시작한 후에는 제대로 작동하는 것 같습니다.


편집기 새로 고침을 위한 코드는 POSIX 및 몇 가지 좋은 내용(소문자 변수 이름, stderr에 인쇄된 오류, ==해결된 주요 문제 등)을 따릅니다.

#!/bin/sh

str_1=nfosys
str_2=Infosys

if [ "$str_1" = "$str_2" ]; then
    echo "Strings are equal"
else
    echo "Strings are not equal" >&2
    exit 1
fi

관련 정보