나는 다음 스크립트를 작성했습니다.
#!/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