아마도 간단한 질문 일 수도 있지만 따옴표가 변수와 어떻게 작동하는지 궁금합니다. 변수 값 주위의 따옴표도 해당 변수에 포함됩니까? 예를 들면 :
fred="\*"
echo $fred
결과는 다음과 같습니다.
\*
왜 그런 겁니까? 나는 그것이 \*
$ fred에 포함되어 출력이 다음과 같을 것이라고 생각합니다.
*
그러나 그것은 일어나는 일이 아닙니다.
에서 bash는 수동 쉘 확장 횟수의 강조 광산 :
확장 순서는 다음과 같습니다. 중괄호 확장; 물결표 확장, 매개 변수 및 변수 확장 , 산술 확장 및 명령 대체 (왼쪽에서 오른쪽으로 수행) 단어 분할; 및 파일 이름 확장.
이를 지원할 수있는 시스템에는 프로세스 대체라는 추가 확장이 있습니다. 이것은 물결표, 매개 변수, 변수, 산술 확장 및 명령 대체와 동시에 수행됩니다.
이러한 확장이 수행 된 후 원래 단어에있는 인용 문자는 자체적으로 인용되지 않는 한 제거됩니다 ( 인용문 제거 ).
그런 다음 인용 제거 확장 대체 할 수있는 뭔가 \*
에 대한 *
강조 광산 :
이전 확장 이후, 위 확장 중 하나에서 발생하지 않은 문자 '\', '' '및' " '의 인용되지 않은 모든 항목 이 제거됩니다 .
그러나 여기에서 하나의 확장 (중요도 포함)이 발생합니다-변수 확장. 변수 확장으로 $fred
대체됩니다 \*
. \*
인용 제거가 수행되지 않도록 문자열은 다른 확장의 결과이다. 그래서 그것은 \*
.
변수 값 주위의 따옴표도 해당 변수에 포함됩니까?
No. $fred
는 두 문자를 포함합니다 \*
.
왜 그런 겁니까?
는 \
또 다른 확장 기인 경우 제거되지 않는다.
파일 이름 확장에 관심이있을 수 있습니다. 파일 이름 확장이 때 발생하는 단어 분할 확장 후 "단어"파일 이름 확장을위한 "자격"인 경우. 예를 들어 *
작은 따옴표 나 큰 따옴표 안에없고 이스케이프되지 않은 문자 가있는 경우 "단어"는 파일 이름 확장에 적합 합니다. *
에서는 \*
그래서 백 슬래시 문자로 이스케이프 *
수행되지 않은 결과 파일 이름 확장에서 여기에 "패턴 문자"... 아닙니다.
글 로빙은 실제로 할당에서 발생합니까?
아니, "Globing"즉. 변수 할당시 파일 이름 확장이 수행되지 않습니다. 에서 bash는 쉘 매개 변수 :
변수는 다음과 같은 형식의 명령문으로 할당 될 수 있습니다.
name=[value]
... 파일 이름 확장이 수행되지 않습니다. ...
재미있는 측면 : 3 개의 슬래시로 파일 이름 확장을 트리거 할 수 있습니다.
fred="\\\*"
touch '\file_with_backslash'
echo $fred # will output `\file_with_backslash`
# and other files you have with leading backslash...
그래서 fred="\\\*"
assings \\*
to fred
(2 개 \\
는 single로 대체됩니다 \
). 그런 다음에 echo $fred
에 있기 때문에, \\
백 슬래시는 baskslash를 탈출하고, 왼쪽은 *
이 패턴 문자와 파일 이름 확장을위한 단어의 자격이 그래서 이스케이프되지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다