이 게시물에는 실제로 두 가지 별도의 질문이 포함되어 있지만 그룹화하면 더 많은 맥락을 얻을 수 있다고 생각합니다. 내가 겪었 변수 따옴표에이 질문 그러나 나는 확실히 이해하지 않는 변수 확장 처음에 평균을. 그래서 첫 번째 질문은 :
- 유닉스 / 리눅스 스포크에서 변수 확장 이란 무엇입니까 ?
내 질문의 두 번째 부분은 다음 용어와 관련이 있습니다.
- 글로브
- 스플릿
위의 의미는 무엇이며 변수 확장에 어떤 영향을 줍니까? 원래 질문에 대한 답변은 다음과 같습니다.
split + glob 연산자로 따옴표 (목록 컨텍스트)가 없다고 생각하십시오.
echo $ test가 echo glob (split ( “$ test”)) 인 것처럼.
나는 globbing 과 splitting 의 개념을 직접적으로 다루는 대답을 찾지 못했지만이 최근의 것과 같은 다른 질문에 대답하는 데 그 용어를 직접 사용합니다 .
답변
변수 확장 (표준 용어는 매개 변수 확장 이며 때로는 변수 대체 라고도 함 )은 기본적으로 변수를 값으로 바꾸는 것을 의미합니다. 보다 구체적으로, 상기 교체 수단 $VARIABLE
구조체를 (또는 ${VARIABLE}
또는 ${VARIABLE#TEXT}
변수의 값으로부터 세우는 다른 텍스트 또는 다른 구조). 이 다른 텍스트는 변수의 확장입니다.
확장 과정은 다음과 같습니다. (나는 일반적인 경우에 대해서만 논의하고 일부 쉘 설정 및 확장은 동작을 수정합니다.)
- 문자열 인 변수의 값을 가져옵니다. 변수가 정의되지 않은 경우 빈 문자열을 사용하십시오.
- 구성에 변환이 포함 된 경우 적용하십시오. 예를 들어, 구문이
${VARIABLE#TEXT}
이고 변수 값 이로 시작하는 경우 값의 시작 부분에서TEXT
제거하십시오TEXT
. - 문맥이 작은 단어 (예 : 큰 따옴표 또는 과제의 오른쪽 또는 여기 문서 내)를 요구하는 경우 여기서 중지하십시오. 그렇지 않으면 다음 단계를 계속하십시오.
- 분할 공백 각 시퀀스에서 개별 단어로 값. 변수
IFS
는 공백 이외의 문자로 분할되도록 변경할 수 있습니다. 따라서 결과는 더 이상 문자열이 아니라 문자열 목록입니다. 값에 공백 만 포함 된 경우이 목록은 비어있을 수 있습니다. - 목록의 각 요소를 파일 이름 와일드 카드 패턴 (예 : glob)으로 취급하십시오 . 패턴이 일부 파일과 일치하면 일치하는 파일 이름 목록으로 대체되고, 그렇지 않으면 패턴이 그대로 유지됩니다.
예를 들어, 변수가 있다고 가정 foo
포함 a* b* c*
하고 현재 디렉토리가 파일을 포함 bar
, baz
하고 paz
. 그런 ${foo#??}
다음 다음과 같이 확장됩니다.
- 변수의 값은 8 자 string
a* b* c*
입니다. #??
는 처음 두 문자를 제거하여 6 자 문자열b* c*
(초기 공백 포함)을 의미합니다.- 확장이 목록 컨텍스트에있는 경우 (즉, 큰 따옴표 또는 다른 유사한 컨텍스트가 아닌 경우) 계속하십시오.
- 문자열을 공백으로 구분 된 단어로 나누면 두 개의 문자열 목록이 나타납니다 :
b*
및c*
. b*
패턴으로 해석 되는 문자열 은 두 파일 (bar
및)과 일치합니다baz
. 문자열c*
은 파일과 일치하지 않으므로 홀로 남겨집니다. 결과는 세 개의 문자열의 목록입니다 :bar
,baz
,c*
.
예를 들어, echo ${foo#??}
prints bar baz c*
(명령 echo
은 사이에 공백으로 인수를 결합합니다).
자세한 내용은 다음을 참조하십시오.
답변
글로브 / 분할
먼저 glob / split을 사용하겠습니다. @Stephane의 답변 은 일반적으로 그 용어를 사용하는 것입니다. 그것들은 실제 명령이 아니며 의사 작업 일뿐입니다.
은 split("$test")
요소의 “배열”에 “$ 테스트”까지의 내용을 나눌 것입니다.
는 glob(...)
다음과 같은 쉘 글 로빙 문자가 포함 이러한 요소의 확장을 돌볼 것 *
또는 범위를 [1-2]
.
예
우리의 끈 $test
이 다음과 같다고 가정하십시오 .
$ test="afile[1-2] afile[3-5]"
또한 파일이 들어있는 디렉토리가 있다고 가정 해 봅시다.
$ ls -1
afile1
afile2
afile3
afile4
afile5
이제 따옴표없이 에코를 시도하면 문자열이 공백으로 분할 된 다음 글러브 문자가 확장되었음을 알 수 있습니다.
$ echo $test
afile1 afile2 afile3 afile4 afile5
그러나 변수를 인수로 전달했을 때 변수를 인용 echo
하면 원래 리터럴 문자열을 얻습니다.
$ echo "$test"
afile[1-2] afile[3-5]
변수 확장
변수 확장이라는 용어는 쉘이 기본 작업의 일부로 수행하는 기본 작업을 포함합니다. 셸은 입력을 구문 분석 한 다음 구문 적으로 올바른 것으로 간주되면이 입력을 실행합니다.
이전 예에서 변수 $test
가 echo
인용되지 않은 상태 로 제시 되었을 때 우리는 쉘에게 계속해서 그 주장을 나누고 나서 그것을 붙잡 으라고 지시했습니다.
인용했을 때 큰 따옴표로 묶은 변수로 해당 기능을 비활성화했습니다.
예
다음은 globbing 및 splitting의 몇 가지 추가 예입니다.
glob / splitting은 자동으로 발생합니다
$ echo file{1..3}
file1 file2 file3
$ echo file{1..3} dir{a..b}
file1 file2 file3 dira dirb
$ echo dir{z..w} file{A..D}
dirz diry dirx dirw fileA fileB fileC fileD
$ echo dir{z..w} file{A..B} fileC
dirz diry dirx dirw fileA fileB fileC
큰 따옴표로 글롭 / 분할 비활성화
$ echo "dir{z..w} file{A..B} fileC"
dir{z..w} file{A..B} fileC
$ echo "dir{z..w} file{A..B}"
dir{z..w} file{A..B}