메인 스크립트를 가져와서 메인 스크립트에서 사용할 수 있는 함수에 인수를 전달하고 함수 정의를 실행하는 서브스크립트가 있습니다. 함수 호출은 제대로 작동하지만 다음과 같은 문제가 발생합니다.
첫 번째
echo
명세서는 인쇄되지 않습니다.아래 첨자 매개변수의 변수가
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}'
포함하다나중에 프로세스에 참조가 필요합니다.)