Command Expansion and Substitution(Week 3-2)

G·2022년 10월 3일
0

2-2 OpenSource

목록 보기
2/12
post-thumbnail

Command Expansion and Substitution

Before getting in

  • 커맨드를 실행시키기 전에 bash는 syntax(구문, 문법)을 명령어 라인에서 찾는다.
  • 배쉬는 특별한 문법을 찾아 해석하여 그에 맞는 라인으로 바꿔준다.
  • 이것을 확장과 치환이라 부른다.

참고 글: Shell environment

Defined order

  • Brace expansion: 숫자, 알파벳의 범위 확장
  • Tilde expansion: built-in 변수 확장
  • Parameter expansion: 변수 값 확장
  • Arithmetic expansion: 산수 확장
  • Command substitution: 명령어 치환
  • Filename expansion(globing): 파일이름 wildcard

Brace Expansion

  • 문자열 조합을 위해 사용되는 확장이다.
  • 접두사나 접미사 즉, 문자열의 어느 자리에 들어가 확장을 한다.
  • 예를 들어, 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})

Tilde Exapansion

pathnames(HOME, PWD, OLDPWD)의 확장이다.

  • ~: HOME 변수 값으로 확장된다(HOME 경로). = echo $HOME
  • ~+: PWD 변수 값으로 확장된다.(current working directory) = echo $PWD
  • OLDPWD 변수 값으로 확장된다.(previous working directory)

Parameter Expansion

변수를 확장한다. ${varname} 또는 $varname의 형식을 통해 변수 값으로 치환해주는 역할을 한다.
두 가지의 기능을 제공한다

  • {VARNAME:-VALUE}: NULL값이나 UNSET일 경우 즉 VALUE로 치환한다.
  • {VARNAME-VALUE} UNSET일 경우 VALUE로 치환한다.

Command Substitution

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

Arithimetic Expansion

산수를 변수 값으로 치환해주는 기능을 한다.
$((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

$ character

  • ${}; Parametric Expansion
  • $(()): Arithmetic Expansion
  • $(): Command Substitution

Filename Expansion

  • 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

Quotes

따옴표는 메타 캐릭터의 기능을 없애는데 사용된다.

  • \: 캐릭터의 의미를 없앤다. ex) *: *가 문자로 인식된다.
  • '': 모든 캐릭터의 의미를 없앤다.
  • ""; parameter, command expansion을 제외하고 모든 캐릭터의 의미를 없앤다.
profile
열심히 안 사는 사람

0개의 댓글