7. 확장과 인용
확장 복습
$ date
Tue May 2 20:31:59 KST 2017
$ man date
$ date +%Y%m%d
20170502
$ mkdir $(date +%Y%m%d)_$USER
$ ls
20170502_jehos a10 a4 a7 passenger.gkkRTwf tmux-2597
20170502_lim a2 a5 a8 snap.0_canonical-livepatch_mwcGC1
a1 a3 a6 a9 tmux-1001
$ alias mktoday='mkdir $(date +%Y%m%d_%H%M)_$USER'
$ alias
# ...
alias mktoday='mkdir $(date +%Y%m%d_%H%M)_$USER'
$ mktoday
$ ls
20170502_2041_jehos 20170502_jehos a2 a6 passenger.gkkRTwf
20170502_2041_lim 20170502_lim a3 a7 snap.0_canonical-livepatch_mwcGC1
20170502_2042_jehos a1 a4 a8 tmux-1001
20170502_2042_lim a10 a5 a9 tmux-2597
따옴표 활용(Quoting, 인용)
쉘에는 다양한 확장 방법이 많다. 그것을 제어하는 방법이 인용이다.
# echo 명령어의 인자에서 불펼요한 공백을 삭제하여 단어분할해 출력
$ echo this is a test
this is a test
# 매개변수 확장으로 정의되지 않은 $1이 빈 문자열로 치환
# 그래서 뒤의 00.00만 출력
$ echo The total is $100.00
The total is 00.00
쌍 따옴표 기호
쌍 따옴표로 텍스트를 묶으면 쉘에서 사용하는 모든 특수한 기호들이 가진 의미가 없어지고 대신 일반적인 문자들로 인식된다.
$, \, ` 기호는 예외다.
즉 단어 분할, 경로명 확장, 틸드 확장, 괄호 확장을 숨길 수 있지만 매개변수 확장, 산술확장, 명령어 치환은 그대로 실행된다.
- 공백문자는 단어분할을 해준다.
- 공백문자는 스페이스 뿐만 아니라, 엔터키, 탭 등 많다.
$ ls -l two words.txt
ls: cannot access 'two': No such file or directory
ls: cannot access 'words.txt': No such file or directory
$ ls -l "two words.txt"
-rw-rw-r-- 1 lim lim 0 May 2 22:29 two words.txt
$ mv "two words.txt" two_words.txt
$ echo \*
*
$ echo "******"
******
$ echo this is a test
this is a test
$ echo this\ is \a \ \ \ \ \test
this is a test
# 특수한 기호들이 가진 의미가 없어지고 일반적인 문자들로 인식
# 그래서 공백이 사라져 단어분할이 안되고 하나의 명령인자로 인식
$ echo "this is a test"
this is a test
$ echo "$USER $((2+2)) $(cal)"
lim 4 May 2017
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
# 명령어 치환의 결과로,
# 38개의 명령 인자를 가진 명령어로 인식
$ echo $(cal)
May 2017 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
$ echo "$(cal)"
May 2017
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
홑 따옴표 기호
쌍따옴표는 세개의 예외가 있는데 홑따옴표는 모두 다 문자로 인식한다.
lim@class:/tmp$ echo '$USER $((2+2))'
$USER $((2+2))
이스케이프 문자
하나의 문자를 인용할 때, 해당 문자 앞에 백슬래시(\
)를 추가한다. 이것을 이스케이프 문자(escape character)라고 부른다.
lim@class:/tmp$ echo "The balance for $100"
The balance for 00
lim@class:/tmp$ echo "The balance for \$100"
The balance for $100
lim@class:/tmp$ echo 'The balance for \$100'
The balance for \$100