우리가 bash에서 엔터를 칠때마다
bash는 우리의 명령어를 수행하기 전에 그 문자에 여러 가공을 한다.
*
는 특히 shell에서 많은 의미가 있다.
명령어를 수행하기 전에 여러 가공을 하는 것을 Expansion 이라한다.
경로명 확장: 와일드카드가 작동하는 매커니즘
'~'를 틸드 문자라고 한다.
단어의 시작 부분에 사용하면 사용자의 홈디렉토리 이름(명명된 사용자가 없다면 현재 사용자의 홈디렉토리)으로 확장된다
셸을 사용하면 확장을 통해 산술연산을 수행할 수 있다
echo $((2 + 2))
이런식으로 $((expression))
산술 표현식을 작성하면 된다
+ - * / % **
연산을 지원한다preamble (선행 부분)과 postscript (후행부분)이 포함될 수 있다
중괄호 표현식에는 쉼표로 구분된 문자열 목록/정수 또는 단일 문자 범위가 포함될 수 있다
패턴에는 따옴표로 묶이 않은 공백이 포함될 수 없다
[me@linuxbox ~]$ echo Front-{A,B,C}-Back
Front-A-Back Front-B-Back Front-C-Back
[me@linuxbox ~]$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
# 정수 zero-pading
[me@linuxbox ~]$ echo {01..15}
01 02 03 04 05 06 07 08 09 10 11 12
[me@linuxbox ~]$ echo {001..15} 13 14 15
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015
# 역순 나열
[me@linuxbox ~]$ echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
작은 데이터 청크를 저장하고 각 청크에 이름을 부여하는 시스템의 기능
!변수!
셸 스크립트에서 많이 쓰임
[me@linuxbox ~]$ echo $USER
me
[me@linuxbox ~]$ printenv | less
[me@linuxbox ~]$ echo $SUER
[me@linuxbox ~]$
명령의 출력을 확장으로 사용 가능
[me@linuxbox ~]$ echo $(ls)
Desktop Documents ls-output.txt Music Pictures Public Templates Videos
# which cp의 결과를 ls 명령에 인수로 전달하여 전체 경로명을 몰라도 cp 프로그램의 목록을 가져온다.
[me@linuxbox ~]$ ls -l $(which cp)
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp
# 파이프라인의 결과가 file 명령의 인수 목록이 됨
[me@linuxbox ~]$ file $(ls -d /usr/bin/* | grep zip)
/usr/bin/bunzip2: symbolic link to `bzip2'
/usr/bin/bzip2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
/usr/bin/bzip2recover: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
/usr/bin/funzip: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
/usr/bin/gpg-zip: Bourne shell script text executable
/usr/bin/gunzip: symbolic link to `../../bin/gunzip'
/usr/bin/gzip: symbolic link to `../../bin/gzip'
/usr/bin/mzip: symbolic link to `mtools'
# 이전 셸 프로그램에는 명령 치환을 위한 대체 문법이 있다. bash에서도 지원. 달러 기호, 괄호 대신 백쿼터(backquote) 사용
[me@linuxbox ~]$ ls -l `which cp`
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp
셸을 제어할 수 있는 방법
[me@linuxbox ~]$ echo this is a test
this is a test
[me@linuxbox ~]$ echo The total is $100.00
The total is 00.00
잘못된 출력
텍스트를 더블쿼츠 안에 넣으면 셸에서 사용하는 모든 특수 문자는 의미를 잃고 일반 문자로 취급
예외 : $ (backslash) `(back-quote)
단어 분리, 경로명 확장, 틸드 확장, 중괄호 확장은 제한되지만 매개변수 확장, 산술확장, 명령 치환은 계속 수행
더블쿼츠를 사용하면 공백이 포함된 파일 이름에 대응할 수 있다
모든 확장을 제한해야 하는 경우 싱글쿼츠 사용
한 문자만 인용하고 싶을 때, 문자 앞에 백슬래시(\)를 넣어 인용