별표의 역할이 계속 바뀌는 이유는 무엇입니까?
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*
일치 하지만 그렇지 않습니다.a
a
aa
ab
b
정규식에서 *
0개 이상의 선행 토큰과 일치하는 수량자는 a*
0개 이상의 a
시퀀스와 일치합니다(예 ''
: a
, , aa
, aaa
, ab
, ) b
.
이러한 점을 염두에 두고 귀하의사례 4다음과 같이 해석될 것이다.다음을 포함하는 모든 문자열과 일치합니다.-
, 패턴 일치로 사용되므로 논의중인 해석이 정규식으로 사용됩니다.
따라서 abcd--1234-defg
가장 짧은 부분 문자열 일치 *-*
는 abcd-
이고 가장 긴 일치는 전체 문자열입니다. 양식을 사용 ${var1#*-*}
하면매개변수 확장$var1
match 에서 가장 짧은 접두사를 제거하려면 match 의 가장 짧은 접두사가 이기 때문에 *-*
얻습니다 .-1234-defg
abcd-
답변2
이해해야 할 두 가지 사항이 있습니다.
글로브에서
*
일치0 이상모든 문자테이블이
${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}
일치하는 접두사 패턴을 제거합니다. 경로 이름 확장과 마찬가지로 단어가 확장되어 패턴을 생성합니다. 패턴이 매개변수 값의 시작과 일치하는 경우 확장 결과는 확장된 매개변수 값입니다. 가장 짧은 일치 패턴(
#
케이스) 또는 가장 긴 일치 패턴(##
케이스)이 제거되었습니다. 인수가 @ 또는 *인 경우 패턴 제거 작업이 각 위치 인수에 차례로 적용되고 확장이 결과 목록이 됩니다. 매개변수가 @ 또는 * 첨자가 붙은 배열 변수인 경우 패턴 제거 작업은 배열의 각 구성원에 차례로 적용되고 확장은 결과 목록입니다. [강조하다. ]