쉘이 텍스트 명령어를 확장할 때, 사용자가 원치 않는 확장에 대해서 따옴표를 활용하여 제어할 수 있다.

아래의 두 예시에서는 $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

+ Recent posts