문자열을 전달하는 조건을 테스트하기 위한 쉘 스크립트

문자열을 전달하는 조건을 테스트하기 위한 쉘 스크립트

조건 문자열은 대문자, 소문자 또는 밑줄(예: _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

이는 예약된 문자이기 때문입니다.

&는 백그라운드에서 명령을 실행한다는 의미입니다.

* 실제 디렉터리의 모든 파일/디렉터리를 확인한 다음 이를 인수로 전달합니다.

() 명령 순서 기본 설정 또는 함수 선언의 경우

이러한 문자를 문자열에 표시하려면 따옴표 "" 또는 '' 안에 넣으십시오.

관련 정보