조건 문자열은 대문자, 소문자 또는 밑줄(예: _abc, xyz 또는 Abc)로 시작합니다.
문자열에는 _f9, f10, car20 또는 top10cars와 같이 첫 번째 문자 뒤에 숫자가 포함될 수 있습니다.
문자열에는 ! @# $ % ^ & * ( ) + - =와 같은 특수 문자가 포함되어서는 안 됩니다.
이건 내 작은 스크립트야
if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
&, * 또는 (와 같은 매개변수만 전달하면 스크립트가 작동하지 않고 커서가 다시 돌아오지 않아 Ctrl+C를 눌러야 하는 경우가 있습니다.
for example ./script.sh (abc
./script.sh &&
./script.sh &abc
스크립트에 무슨 문제가 있나요?
답변1
인용하다.
스크립트 "$1"
에서는 $1
.
명령줄에서 다음을 사용합니다.
./script '*(ontehu'
바꾸다
./script *(ontehu
./script.sh (abc
이는 쉘 구문의 구문 오류입니다../script.sh &&
이로 인해 쉘은 명령줄에 조건부 AND가 있다고 생각하고 연산자 오른쪽에 뭔가가 있을 것으로 예상합니다&&
../script.sh &abc
./script
백그라운드 프로세스로 시작( 사용&
) 및 command 의 두 가지 명령이 있습니다abc
.
이러한 모든 경우에 매개변수는 따옴표로 묶어야 합니다(이상적으로는 작은 따옴표, 쉘 변수의 값을 보간하기 위해 쉘이 필요하지 않은 경우 큰따옴표를 사용해야 함).
귀하의 스크립트:
if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
인용하다 $1
:
if [[ "$1" =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
뒤에 숫자가 있는 값이 허용됩니다.
if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
echo it matches
else
echo does_not match
fi
오류를 올바르게 보고합니다(추가 사항).
if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
printf '"%s" is a valid variable name\n' "$1"
else
printf '"%s" is not a proper variable name\n' "$1" >&2
exit 1
fi
답변2
이는 예약된 문자이기 때문입니다.
&는 백그라운드에서 명령을 실행한다는 의미입니다.
* 실제 디렉터리의 모든 파일/디렉터리를 확인한 다음 이를 인수로 전달합니다.
() 명령 순서 기본 설정 또는 함수 선언의 경우
이러한 문자를 문자열에 표시하려면 따옴표 "" 또는 '' 안에 넣으십시오.