Bash에서 특수 문자의 역할 전환

Bash에서 특수 문자의 역할 전환

별표의 역할이 계속 바뀌는 이유는 무엇입니까?

CASE 1: 
var1=abcd-1234-defg 
echo ${var1#*-*}        # RESULT: 1234-defg

CASE 2: 
stringZ=abcABC123ABCabc 
echo `expr match "$stringZ" '\(abc[A-Z]*.2\)'`  # RESULT: abcABC12

별표의 역할은 언제, 어떻게 결정되나요?

CASE 3:
path_name="/home/bozo/ideas/thoughts.for.today"
echo ${path_name##/*/}  # RESULT : thoughts.for.today

/이 경우에는 탈출의 역할, 즉 탈출을 시도하는 기본 특성이 여기에 작용하고 있다고 잘못 생각합니다 *. 알았어 미안해 그렇다면 이러한 특수 캐릭터의 역할은 어떻게, 누구에 의해 결정됩니까?

CASE 4: 
var1=abcd--1234-defg 
echo ${var1#*-*}        # RESULT: -1234-defg  & i was expecting 1234-defg

CASE 4는 CASE 1과 비슷하지만 차이점을 알 수 있는데 abcd--, 예상했던 1234-defg대로 결과는 CASE 1과 같습니다.

*-*사례 4에 대한 나의 설명은 다음과 같습니다.

쉘은 - OR -- OR ---를 찾을 때까지 var1에서 시작하는 모든 것을 찾습니다.

사례 4에 대한 해석이 잘못된 이유는 무엇입니까?

답변1

그것은 *테스트에서 다른 의미를 갖기 때문입니다.

존재하다사례 1,사례 3그리고사례 4, 이는 다음과 같이 사용됩니다.패턴 매칭. 그리고사례 2, 그것은정규식메타 문자(또는 수량자 또는클린트).

패턴 일치에서 *문자는 빈 문자열을 포함하여 모든 문자열과 일치하며 , example , 로 시작하는 모든 문자열 과 a*일치 하지만 그렇지 않습니다.aaaaabb

정규식에서 *0개 이상의 선행 토큰과 일치하는 수량자는 a*0개 이상의 a시퀀스와 일치합니다(예 '': a, , aa, aaa, ab, ) b.

이러한 점을 염두에 두고 귀하의사례 4다음과 같이 해석될 것이다.다음을 포함하는 모든 문자열과 일치합니다.-, 패턴 일치로 사용되므로 논의중인 해석이 정규식으로 사용됩니다.

따라서 abcd--1234-defg가장 짧은 부분 문자열 일치 *-*abcd-이고 가장 긴 일치는 전체 문자열입니다. 양식을 사용 ${var1#*-*}하면매개변수 확장$var1match 에서 가장 짧은 접두사를 제거하려면 match 의 가장 짧은 접두사가 이기 때문에 *-*얻습니다 .-1234-defgabcd-

답변2

이해해야 할 두 가지 사항이 있습니다.

  1. 글로브에서 *일치0 이상모든 문자

  2. 테이블이 ${var1#*-*}삭제되었습니다.가장 짧은성냥.

따라서 ${var1#*-*}첫 번째 대시만 제거됩니다.가장 짧은성냥.

완전성을 위해 주석은 ${var1##*-*}가장 긴 일치 항목을 제거합니다.

아래의 각 경우에,가장 짧은일치하는 접두사가 제거됩니다.

$ var1=abcd-1234-defg 
$ echo ${var1#*}
abcd-1234-defg
$ echo ${var1#*-}
1234-defg
$ echo ${var1#*-*}
1234-defg
$ echo ${var1#*-*-}
defg
$ echo ${var1#*-*-*}
defg

위 상황과 ##삭제된 상황을 비교해보세요가장 긴접두어 일치:

$ echo ${var1##*-}
defg
$ echo ${var1##*-*}

$ 

문서

에서 man bash:

${parameter#word}
${parameter##word}

일치하는 접두사 패턴을 제거합니다. 경로 이름 확장과 마찬가지로 단어가 확장되어 패턴을 생성합니다. 패턴이 매개변수 값의 시작과 일치하는 경우 확장 결과는 확장된 매개변수 값입니다. 가장 짧은 일치 패턴( #케이스) 또는 가장 긴 일치 패턴( ##케이스)이 제거되었습니다. 인수가 @ 또는 *인 경우 패턴 제거 작업이 각 위치 인수에 차례로 적용되고 확장이 결과 목록이 됩니다. 매개변수가 @ 또는 * 첨자가 붙은 배열 변수인 경우 패턴 제거 작업은 배열의 각 구성원에 차례로 적용되고 확장은 결과 목록입니다. [강조하다. ]

관련 정보