Unix 쉘스크립트에서 위치 매개변수를 읽을 때 $ 기호 문제

Unix 쉘스크립트에서 위치 매개변수를 읽을 때 $ 기호 문제

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

#!/bin/bash

TEST=$1
TEST_1=$2

if [[ "$TEST" == e ]];then
echo $TEST_1
else
echo "Input is not e"
fi

이제 실행하면:

sh test.sh e NS3#$xX$56M

그러면 출력은 다음과 같습니다.

NS3#56M

그러면 모든 $xX$문자가 제거됩니다. 특수문자를 포함한 모든 문자를 얻을 수 있는 방법이 있나요?

답변1

그 이유는 당신이 당신의 말을 인용하지 않기 때문입니다.입력하다. 스크립트에 전달하는 매개변수에는 가 포함되어 있으며 $매개변수는 따옴표 없이(예: 간단히 NS3#$xX$56M) 전달합니다. 이는 다음의 영향을 받는다는 의미입니다.변수 확장. 이는 쉘을 해석하는 것을 의미합니다.

sh test.sh e NS3#$xX$56M

test.sh스크립트를 호출하는 명령은 먼저 $xX해당 부분을 셸 변수(로컬로 정의되거나 환경 변수로 내보낸)의 내용으로 바꾸려고 시도 xX하고, 해당 부분이 없을 수도 있으므로 전달하기 전에 해당 부분을 "없음"으로 바꿉니다. 결과를 스크립트에 추가합니다. 그러나 이것은 쉘의 올바른 기능이므로 @roaima가 지적한 것처럼 스크립트에 큰 문제가 없습니다.

이 문제를 방지하려면 문자열을 작은따옴표로 묶으십시오. 그러면 확장이 비활성화됩니다.

sh test.sh e 'NS3#$xX$56M'

스크립트에 대한 일반적인 참고 사항은 다음과 같습니다.

  • 변수 이름을 환경으로 내보내려는 의도가 아니면(즉, test대신 사용 TEST) 변수 이름을 모두 대문자로 사용하지 마십시오. 이렇게 하면 스크립트 변수와 잠재적으로 중요한 환경 변수 간의 불필요한 충돌을 방지할 수 있습니다.
  • 사용shellcheck, 많은 Linux 배포판에서 스크립트를 "교정"하기 위한 독립 실행형 프로그램으로도 사용할 수 있습니다. 이는 많은 오류를 방지하는 데 도움이 됩니다.
  • 발생한 문제로 판단하면,항상 쉘 변수를 올바르게 인용하십시오.변수/전역 확장 및 토큰화를 원한다는 것을 명시적으로 알지 않는 한 이를 사용하십시오. 이는 스크립트에서 쉘 변수를 사용할 때도 적용됩니다.
  • 이 스크립트를 호출합니다.
    sh test.sh ....
    
    이는 -line을 재정의 #!하고 sh많은 시스템에서 연산자를 이해하지 못하는 POSIX 호환 쉘인 쉘을 사용합니다 [[ ... ]]. 예를 들어 실행 가능하게 만들고 로 호출 ./test.sh하거나 명시적으로 사용합니다 bash test.sh.

관련 정보