쉘이 텍스트 명령어를 확장할 때, 사용자가 원치 않는 확장에 대해서 따옴표를 활용하여 제어할 수 있다.
아래의 두 예시에서는 $1000 을, 여러 공백을 출력하고자 하였지만 확장으로 인해 제대로 출력되지 않는다.
echo Price is $1000 won. # 이 경우 $1 에 대해 매개변수로 확장한다
echo Hi there # 중간의 불필요한 공백들을 삭제한다
단어 분할
위의 예시에서 쉘이 Hi there 이 Hi there 로 출력하는 것은 불필요한 공백을 삭제하는 단어 분할이다.
기본적으로 단어 분할은 빈칸, 탭(\t), 줄바꿈(\n) 을 인식하고 텍스트에서 단어 간의 구분자로써 처리한다.
즉, 이러한 구분자들을 텍스트로 보는 것이 아니라 단어를 나눠주는 역할로써만 보고 공백으로 통일시켜 출력하는 것이다.
어떤 느낌인지 와닿고 싶다면 아래 명령어들을 쳐볼 수 있다.
echo $(cal)
echo "$(cal)"
둘 다 현 시간대의 달력을 출력하지만, 위의 명령어는 단어 분할이 적용되어 텍스트 사이에 존재하는 탭과 개행들이 사라졌다.
즉 해당 구분자들로 나뉘어진 몇십개의 인자를 갖는 명령어로 처리되는 것이다.
아래 명령어는 쌍 따옴표를 통해 단어 분할을 하지 않게 제어하여서 탭과 개행들이 텍스트로써 포함된 하나의 인자를 갖게 된다.
쌍 따옴표 기호
쌍 따옴표로 특정 범위의 텍스트를 묶으면, 해당 범위의 특수 기호들을 전부 단순 문자로만 인식한다.
즉, 단어 분할(불필요한 공백), 경로명 확장, 괄호나 중괄호 확장 등이 무시되고 텍스트 그대로 출력된다.
보통 cp 나 ls 등의 명령어에서 파일명에 띄어쓰기가 들어가 있는 경우, 파일명을 인자로 넣어주기가 상당히 불편하다.
띄어쓰기로 나뉜 두개의 파일명을 인자로 받는다고 인식하기 때문인데, 쌍 따옴표로써 단어 분할 확장을 제어할 수 있다.
ls hello world.cpp # hello / world.cpp
ls "hello world.cpp" # hello world.cpp
따옴표 기호
따옴표 기호는 쌍 따옴표 기호보다 좀 더 강력하다.
쌍 따옴표 기호 같은 경우 특수 문자들이 무시되어 텍스트가 그대로 출력된다고 했지만, $, \, ` 이 세 문자는 예외이다.
즉 매개변수 확장, 산술 확장, 명령어 치환 등은 쌍 따옴표 안에 들어가더라도 그대로 실행된다는 뜻이다.
이것이 위에서 쌍 따옴표로 $(cal) 을 묶었더라도 단어 분할만 제어했지 명령어 치환은 제어하지 못한 이유이다.
일반 따옴표로 묶을 경우엔 모든 확장을 숨길 수 있다.
echo $USER $((1+2+3)) repeat{a,b,c} ~/test # 변수명, 산술, 중괄호, 틸드 확장이 그대로 적용
echo "$USER $((1+2+3)) repeat{a,b,c} ~/test" # 중괄호와 틸드 확장은 제어
echo '$USER $((1+2+3)) repeat{a,b,c} ~/test' # 모든 확장이 제어(텍스트 그대로 출력)
이스케이프 문자
쌍 따옴표로 묶었더라도 예외인 기호들에 대해서 텍스트로 처리할 수 있게 해주는 문자가 바로 \ 인 이스케이프 문자이다.
일반적인 프로그래밍 언어들에서 널리 배웠던 개념과 같아서 받아들이기 편하다.
꼭 쌍 따옴표 안에서만 활용되는 것은 아니고, 특수기호들이 포함된 파일명을 텍스트 명령어로 넣어주고 싶을 때 활용할 수도 있다.
ls A\&B # A&B
ls A\\B # A\B
'STUDY > Linux' 카테고리의 다른 글
[리눅스] Permission (0) | 2021.07.05 |
---|---|
[리눅스] 커맨드라인 키보드 기법 (0) | 2021.07.01 |
[리눅스] 확장 (0) | 2021.06.28 |
[리눅스] 파이프라인 (0) | 2021.01.27 |
[리눅스] 리다이렉션 (0) | 2021.01.25 |