나는 다음 스크립트를 작성했습니다.
#!/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 배포판에서 스크립트를 "교정"하기 위한 독립 실행형 프로그램으로도 사용할 수 있습니다. 이는 많은 오류를 방지하는 데 도움이 됩니다. - 발생한 문제로 판단하면,항상 쉘 변수를 올바르게 인용하십시오.변수/전역 확장 및 토큰화를 원한다는 것을 명시적으로 알지 않는 한 이를 사용하십시오. 이는 스크립트에서 쉘 변수를 사용할 때도 적용됩니다.
- 이 스크립트를 호출합니다.
이는 -line을 재정의sh test.sh ....
#!
하고sh
많은 시스템에서 연산자를 이해하지 못하는 POSIX 호환 쉘인 쉘을 사용합니다[[ ... ]]
. 예를 들어 실행 가능하게 만들고 로 호출./test.sh
하거나 명시적으로 사용합니다bash test.sh
.