매개변수의 변수 값이 구문 분석되지 않아 echo 문을 인쇄할 수 없습니다. [닫기]

매개변수의 변수 값이 구문 분석되지 않아 echo 문을 인쇄할 수 없습니다. [닫기]

메인 스크립트를 가져와서 메인 스크립트에서 사용할 수 있는 함수에 인수를 전달하고 함수 정의를 실행하는 서브스크립트가 있습니다. 함수 호출은 제대로 작동하지만 다음과 같은 문제가 발생합니다.

  1. 첫 번째 echo명세서는 인쇄되지 않습니다.

  2. 아래 첨자 매개변수의 변수가 now확인되지 않았습니다.

    아래에서 내 결과를 찾아보세요.

메인 스크립트

Function_1 ()
{
cd /home/test/

File_name="$1".txt

if [[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]; then
echo " For your Info, File name can be alpha numeric and can contain special characters like $_."&'#" please proceed "
fi

 if [[ -f "$File_name" ]];
then
echo "File Name - $File_name"
else 
echo "File Name - $File_name doesn't exists"
 fi

}

아래 첨자

export now=$( date '+%Y%m%d' )
Function_1 'abc_${now}' 

예상되는 결과

For your Info, File name can be alpha numeric and can contain special characters like $_."&'#" please proceed 
File Name - abc_20200204.txt

실제 결과

File Name - abc_$now.txt doesn't exists

답변1

if [[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]; then

"a 및 a를 사용하므로 '표현식이 불완전하고 실패합니다.

답변2

귀하가 겪고 있는 문제는 일반적으로 처리 문제로 인한 것일 수 있다고 생각합니다.특수 문자그리고인용하다쉘 스크립트에서.

주요 설명: 서브스크립트가 기본 스크립트의 함수에 어떻게 액세스하는지 언급하지 않았지만 다음과 같은 작업을 수행했다고 가정합니다.

~$ source main_script.sh
~$ export now=$( date '+%Y%m%d' )
~$ Function_1 'abc_${now}'

이렇게 하면 쉘에서 여러 구문 오류가 발생하고 스크립트가 작동하지 않습니다. 나는 당신이 bash그 태그를 사용한 이후로 당신도 그렇게 했다고 가정하고 있으며, 이러한 오류가 발생하지 않았다는 사실에 놀랐다는 것을 인정합니다. shellcheck다음과 같은 도구 사용을 고려할 수도 있습니다 .온라인또는 쉘 스크립트를 확인하기 위한 많은 Linux 배포판의 패키지로서 오타 등을 찾는 데 확실히 도움이 됩니다.

이제 발생한 문제에 대해 이야기하십시오.

첫 번째 출력은 절대 발생하지 않을 것이라고 명시했습니다 echo. 나는 이것이 정규 표현식의 구성과 특수 문자의 사용과 관련이 있다고 생각합니다.

  • 테스트 문에서는 [[ "$File_name" =~ ^[[:alnum:]][[$_."#&']] ]]쉘 특수 문자가 포함된 문자 목록을 사용합니다. 예를 들어 다음과 같습니다.[$_."#&']$_마지막 쉘 인수로 해석됨, 그리고 큰따옴표는 쉘에 의해 명령 의 첫 번째 라인과 함께 다음 라인에서 끝나는 "리터럴 문자열의 시작으로 해석됩니다 . 쉘은 내가 시도했을 때 쉘이 제안한 대로 출력 메시지를 해석하려고 시도하기 때문에 구문 오류가 발생합니다. 에 표시된 대로 셸에서 원치 않는 해석을 방지하려면 이러한 문자를 이스케이프해야 합니다 ."echo\$_\"\#\&\'
  • 또한 대괄호를 사용하여 [[ ... ]]문자 목록을 나타낼 수 있습니다. 그러나 이는 구문적으로 정의되지 않았습니다. 무엇[ ... ]하나의 문자만 포함하는 목록을 정의합니다.특징수업,예를 들어 [:alnum:].이것[[:alnum:]]어떤 종류의 구문은 정규식의 첫 번째 부분에서 했던 것처럼 실제로 로 작성됩니다 . 따라서 "바깥쪽" 대괄호 쌍을 생략해야 합니다.
  • "start 앵커"를 사용하여 정규식을 시작했습니다 ^. 그래서 나는 당신이 파일 이름을 허용하고 싶다고 가정합니다.시작일반 문자나 숫자가 포함되어 있지만 언급한 특수 문자가 모두 포함될 수 있습니다. 그러나 정규 표현식은 다음으로 시작하는 파일 이름만 허용합니다.하나영숫자 문자필요하다두 번째 문자로 특수 문자 중 하나입니다. 영숫자 외에 임의 개수의 문자가 허용되는지 확인하려면 다음과 같이 작성하면 됩니다 ^[[:alnum:]][[:alnum:]\$_.\"\#\&\']*$. 두 번째 부분은 [ ... ]문자 클래스와 문자를 포함하는 [:alnum:]문자 목록 입니다.또한특수 문자 $, _, ., ", #, &및 는 문자열 끝까지( )까지 '0회 이상( ) 입니다. 마지막 앵커 문자는 다음을 보장합니다.*$모두파일 이름에는 허용된 문자만 포함됩니다.

다음 요점은 ${now}변수가 해결되지 않는 것과 관련이 있습니다(예:"확장하다"쉘 용어로).

  • 여러 의견에서 이미 지적했듯이 매개변수 확장은 작은따옴표 안에서는 발생하지 않습니다 ' ... '. 큰따옴표를 사용하면 " ... "변수 확장이 작동합니다.

  • 이 시점에서 작은 따옴표가 필요한 것 같습니다. 이 경우에는 추가 설명이 필요할 수 있습니다.작은따옴표가 필요합니다(예: 달성하려는 내용 또는 표현식을 추가로 처리할지 여부)'abc_${now}' 포함하다나중에 프로세스에 참조가 필요합니다.)

관련 정보