태그 보관물: shell-script

shell-script

쉘 변수 확장 및 glob 및 split 효과 수 있다고 생각합니다. 내가 겪었 변수

이 게시물에는 실제로 두 가지 별도의 질문이 포함되어 있지만 그룹화하면 더 많은 맥락을 얻을 수 있다고 생각합니다. 내가 겪었 변수 따옴표에이 질문 그러나 나는 확실히 이해하지 않는 변수 확장 처음에 평균을. 그래서 첫 번째 질문은 :

  1. 유닉스 / 리눅스 스포크에서 변수 확장 이란 무엇입니까 ?

내 질문의 두 번째 부분은 다음 용어와 관련이 있습니다.

  1. 글로브
  2. 스플릿

위의 의미는 무엇이며 변수 확장에 어떤 영향을 줍니까? 원래 질문에 대한 답변은 다음과 같습니다.

split + glob 연산자로 따옴표 (목록 컨텍스트)가 없다고 생각하십시오.

echo $ test가 echo glob (split ( “$ test”)) 인 것처럼.

나는 globbingsplitting 의 개념을 직접적으로 다루는 대답을 찾지 못했지만이 최근의 것과 같은 다른 질문에 대답하는 데 그 용어를 직접 사용합니다 .



답변

변수 확장 (표준 용어는 매개 변수 확장 이며 때로는 변수 대체 라고도 함 )은 기본적으로 변수를 값으로 바꾸는 것을 의미합니다. 보다 구체적으로, 상기 교체 수단 $VARIABLE구조체를 (또는 ${VARIABLE}또는 ${VARIABLE#TEXT}변수의 값으로부터 세우는 다른 텍스트 또는 다른 구조). 이 다른 텍스트는 변수의 확장입니다.

확장 과정은 다음과 같습니다. (나는 일반적인 경우에 대해서만 논의하고 일부 쉘 설정 및 확장은 동작을 수정합니다.)

  1. 문자열 인 변수의 값을 가져옵니다. 변수가 정의되지 않은 경우 빈 문자열을 사용하십시오.
  2. 구성에 변환이 포함 된 경우 적용하십시오. 예를 들어, 구문이 ${VARIABLE#TEXT}이고 변수 값 이로 시작하는 경우 값의 시작 부분에서 TEXT제거하십시오 TEXT.
  3. 문맥이 작은 단어 (예 : 큰 따옴표 또는 과제의 오른쪽 또는 여기 문서 내)를 요구하는 경우 여기서 중지하십시오. 그렇지 않으면 다음 단계를 계속하십시오.
  4. 분할 공백 각 시퀀스에서 개별 단어로 값. 변수 IFS는 공백 이외의 문자로 분할되도록 변경할 수 있습니다. 따라서 결과는 더 이상 문자열이 아니라 문자열 목록입니다. 값에 공백 만 포함 된 경우이 목록은 비어있을 수 있습니다.
  5. 목록의 각 요소를 파일 이름 와일드 카드 패턴 (예 : glob)으로 취급하십시오 . 패턴이 일부 파일과 일치하면 일치하는 파일 이름 목록으로 대체되고, 그렇지 않으면 패턴이 그대로 유지됩니다.

예를 들어, 변수가 있다고 가정 foo포함 a* b* c*하고 현재 디렉토리가 파일을 포함 bar, baz하고 paz. 그런 ${foo#??}다음 다음과 같이 확장됩니다.

  1. 변수의 값은 8 자 string a* b* c*입니다.
  2. #??는 처음 두 문자를 제거하여 6 자 문자열  b* c*(초기 공백 포함)을 의미합니다.
  3. 확장이 목록 컨텍스트에있는 경우 (즉, 큰 따옴표 또는 다른 유사한 컨텍스트가 아닌 경우) 계속하십시오.
  4. 문자열을 공백으로 구분 된 단어로 나누면 두 개의 문자열 목록이 나타납니다 : b*c*.
  5. 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]

변수 확장

변수 확장이라는 용어는 쉘이 기본 작업의 일부로 수행하는 기본 작업을 포함합니다. 셸은 입력을 구문 분석 한 다음 구문 적으로 올바른 것으로 간주되면이 입력을 실행합니다.

이전 예에서 변수 $testecho인용되지 않은 상태 로 제시 되었을 때 우리는 쉘에게 계속해서 그 주장을 나누고 나서 그것을 붙잡 으라고 지시했습니다.

인용했을 때 큰 따옴표로 묶은 변수로 해당 기능을 비활성화했습니다.

다음은 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}

답변