- 커맨드를 실행시키기 전에 bash는 syntax(구문, 문법)을 명령어 라인에서 찾는다.
- 배쉬는 특별한 문법을 찾아 해석하여 그에 맞는 라인으로 바꿔준다.
- 이것을 확장과 치환이라 부른다.
참고 글: Shell environment
- 문자열 조합을 위해 사용되는 확장이다.
- 접두사나 접미사 즉, 문자열의 어느 자리에 들어가 확장을 한다.
- 예를 들어, b{ed, olt,ar}은 확장되어 bed, bolt, bar로 확장된다.
- {1,10} //1 10
- {1..10} //1 2 3 4 5 6 7 8 9 10
- {1..10..2} //1 3 5 7 9 1
- {a..e..2} a c e
- {1,2}{c,h} 1c 1h 2c 2h
알파벳도 동일하게 동작한다.
- 괄호{}안의 단일요소는 확장되지 않는다.
- 괄호안의 범위에 ws가 있을 경우 확장되지 않는다.
- 성질이 다른 요소들은 확장되지 않는다.(ex. {5..K})
pathnames(HOME, PWD, OLDPWD)의 확장이다.
- ~: HOME 변수 값으로 확장된다(HOME 경로). = echo $HOME
- ~+: PWD 변수 값으로 확장된다.(current working directory) = echo $PWD
- OLDPWD 변수 값으로 확장된다.(previous working directory)
변수를 확장한다. ${varname} 또는 $varname의 형식을 통해 변수 값으로 치환해주는 역할을 한다.
두 가지의 기능을 제공한다
- {VARNAME:-VALUE}: NULL값이나 UNSET일 경우 즉 VALUE로 치환한다.
- {VARNAME-VALUE} UNSET일 경우 VALUE로 치환한다.
built-in 명령어를 명령어의 변수 값으로 치환해준다.
$(명령어이름) or `명령어이름` 형식으로 사용한다.
예제
$echo User $(whoami) is on `hostname`
User inha is on ubuntu
$ echo `echo `ls`` # INCORRECT
$ echo $(echo $(ls)) # CORRECT
Test.txt
$echo "Today is $(date)"
Today is Tue Nov 9 06:37:53 PST 2021
$echo "Today is `date +%Y%m%d`"
Today is 20211109
산수를 변수 값으로 치환해주는 기능을 한다.
$((expression)) 또는 $[expression]로 사용된다. 후자는 이제 사용하지 않는다.
예제
$ a=10
$ b=20
$ c=a+b
$ echo $a $b $c
10 20 a+b
$ c=$(( a+b ))
$ echo $a $b $c
10 20 30
$ d=$(( c = a ** 2 ))
$ echo $a $b $c $d
10 20 100 100
- ${}; Parametric Expansion
- $(()): Arithmetic Expansion
- $(): Command Substitution
- ls *: 모든 파일
- ls a*: a로 시작하는 모든 파일
- ls *.c: 모든 .c확장자 파일
- ls ut*.c: ut로 시작하는 모든 .c확장자 파일
- ls > 하나의 문자의 이름을 가진 파일
- ls fo?: fo로 시작하는 세 개의 문자의 이름을 가진 파일
- ls[abc]*: a,b,c로 시작하는 파일
- ?: 아무 하나의 문자
- *: 모든 문자열
- [set]: set에 포함된 문자
- [^set] or [!set]: set에 포함된 문자를 제외한 문자
주의사항
- brace expansion의 우선순위가 filename expansion보다 더 높다.
예제코드
$ ls test?.[c-o]
test1.c test1.h test1.o test2.c test2.h test2.o test3.c
test3.h test3.o
$ ls test?.{c..o}
ls: cannot access 'test?.d': No such file or directory
따옴표는 메타 캐릭터의 기능을 없애는데 사용된다.
- \: 캐릭터의 의미를 없앤다. ex) *: *가 문자로 인식된다.
- '': 모든 캐릭터의 의미를 없앤다.
- ""; parameter, command expansion을 제외하고 모든 캐릭터의 의미를 없앤다.