bash 변수를 큰따옴표로 비교하는 방법

bash 변수를 큰따옴표로 비교하는 방법

이 코드가 있습니다

STATUS=`echo "test"`


if [ $STATUS == "test" ]; then
   exit 0
fi

나는 모든 것을 시도했지만 그것을 달성할 수 없습니다.

나는 노력했다

"$STATUS" == "test"
eval $STATUS == "test"
${STATUS[@]} == "test"

작동하는 유일한 것은

$STATUS == \"test\"

답변1

질문의 코드가 작동합니다. 이는 해당 exit 0명령문이 실행된다는 의미입니다.

당신의

STATUS=`echo "test"`

동일합니까?

STATUS="test"

그리고 (이 경우) 다음과 같이

STATUS=test

즉, 변수가 값으로 STATUS지정됩니다 test(값에 큰따옴표 없음).

이 값을 테스트하려면 test다음을 수행하십시오.

if [ "$STATUS" = "test" ]

또는

if [[ $STATUS == "test" ]]

다음과 같은 STATUS값이 있는 경우"test"

STATUS='"test"'

그런 다음 해당 문자열을 비교하여 사용하십시오.

if [ "$STATUS" = '"test"' ]

또는

if [[ $STATUS == '"test"' ]]

또한보십시오:

답변2

이스케이프된 따옴표는 \"test\"쉘의 인용 규칙에 약간의 혼란이 있다고 생각하게 만듭니다. 코드의 첫 번째 부분은 예상대로 작동하지만 $STATUS == \"test\"작동해서는 안 되기 때문입니다(작성했거나 STATUS=`echo '"test"'`이와 유사한 것이 아닌 한).

이러한 혼란을 적절하게 설명하려면 몇 가지 쉘 개념을 설명해야 합니다.


인용하다

POSIX 셸에서 인용은 가장 중요한 메커니즘 중 하나입니다. 불행하게도 이는 매우 혼란스러운 주제이기도 하며, 잘못 사용하면 스크립트에서 버그와 이상한 동작이 발생하는 중요한 원인이 될 수 있습니다.

기본 규칙은 다음과 같습니다.

  1. 이스케이프 문자 \:제외하고 다음 문자의 리터럴 값을 유지합니다 <newline>.
  2. 큰따옴표 ":$, 및 (기록 확장이 활성화된 경우)를 제외하고 따옴표 안에 있는 모든 문자의 리터럴 값을 유지합니다 .`\!
  3. 아포스트로피 ':예외 없이 따옴표 안에 있는 모든 문자의 리터럴 값을 유지합니다.

명령 대체

명령 대체를 사용하면 명령 출력이 명령 자체를 대체할 수 있습니다. 구문은 $(command)or `command`이지만 전자가 선호됩니다.

테스트 명령

이 명령(POSIX 및 bash, ksh, zsh 등의 셸에서는 이 명령이라고도 함 test)을 사용하면 유용한 조건부 및 산술 표현식을 많이 사용할 수 있습니다. 예를 들어, 주어진 일반 파일이 존재하고 읽을 수 있는지, 두 문자열이 동일한지 또는 한 숫자가 다른 숫자보다 큰지 여부를 확인할 수 있습니다.[[[


이제 코드를 분석해 보세요.

STATUS=`echo "test"`

여기서 명령 대체는 다음과 같이 작성할 수 있으므로 소용이 없습니다 STATUS="test". 큰따옴표는 에서 인쇄되지 않으므로 echo해당 값으로 STATUS유지됩니다 .test

if [ $STATUS == "test" ]; then
   exit 0
fi

여기에는 적어도 3가지 잠재적인 함정이 있습니다.

  1. 인용되지 않은 내용은 $STATUS단어 분할의 영향을 받을 수 있습니다.
  2. ==이는 POSIX가 아닌 구문입니다. =휴대성을 중요시한다면 이것을 사용하세요.
  3. if그리고 이 경우에는 이미 의도한 작업을 수행 exit 0하므로 쓸모가 없습니다 .[

또한 이전 코드 줄과 마찬가지로 큰따옴표는 문자 그대로 사용되지 않으므로 생성된 명령(따옴표를 확장하고 제거한 후)은 [ test = test ]올바른 것입니다.


하지만 목표가 "test"가치를 갖는 STATUS것이라면

STATUS=\"test\"
STATUS="\"test\""
STATUS='"test"'

모두 유효한 작업이며

[ "$STATUS" = \"test\" ]
[ "$STATUS" = "\"test\"" ]
[ "$STATUS" = '"test"' ]

모두 유효한 조건식입니다.

답변3

사용 중인 셸에 따라 이 문제에 대한 해결 방법이 다를 수 있습니다. 또한 스크립트의 "echo $STATUS" 줄과 비교하기 전에 $STATUS에 "test"가 포함되어 있는지 확인하세요. 변수의 내용을 검사하는 것은 디버깅에 매우 도움이 될 수 있습니다. 가능성은 희박하지만, 다른 프로그램이 이를 설정하고 있을 가능성이 적으며, 이 경우 분명히 실패할 것입니다.

일반적으로 말해서, 여러분이 작성하는 코드는~해야 한다일하다. 그렇지 않은 경우 문제는 스크립트의 다른 코드, 셸 자체 또는 기타 프로그램 간섭일 수 있습니다. 내보내기를 사용하여 변수를 시스템 전체로 내보내어 변수가 올바르게 설정되었는지 확인할 수 있습니다. 여기에는 모든 간섭 값이 포함되어야 합니다. 다른 프로그램이 간섭하는 경우 변수가 변경되는 것을 좋아하지 않을 수 있다는 점을 명심하세요.

참고로 다음 정보를 알려드리겠습니다.

변수를 간단한 상태(예: "테스트")로 설정하는 가장 좋은 방법은 다음과 같습니다.

VARIABLE="value"

echo를 사용하여 텍스트를 변수로 반환할 수 있지만 test와 같은 문자열을 사용하면 그렇게 할 이유가 없습니다. 제어 문자(예: 개행 문자)를 삽입하기 위해 echo -e 또는 printf를 사용할 계획이 아니라면.

문자열을 비교하는 데 권장되는 방법은 다음 방법 중 하나를 사용하는 것입니다.

if [ "$VARIABLE" = "value" ]; then
if [[ $VARIABLE == value ]]; then

아직 시도하지 않았다면 클래식 테스트라고도 알려진 [ 대신 확장 테스트라고도 알려진 새로운 [[를 사용해 보세요.

http://wiki.bash-hackers.org/commands/classictest

http://wiki.bash-hackers.org/syntax/ccmd/conditional_expression

테스트 운영자에 대한 모든 세부 정보를 알고 싶다면 더 많은 정보를 얻는 데 도움이 되는 훌륭한 리소스를 참조하세요.

관련 정보