참고:
Shell Expansion
이란?
Shell Expansion
은 쉘에서 프로그램을 실행하기 전에 입력 받은 문자들 중에서
약속된 특수 문자들을 추려내서 정해진 의미로 재해석하여 입력, 출력하는 것이다.
참고: Shell Expansion 에는 뭐가 있는가?
Brace expansion
Tilde expansion
Parameter expansion
command substitution
word splitting
filename expansion
이 글에서 정리하고자 하는 것은
Parameter expansion
이다
우리가 어떤 파리미터(또는 변수)에 여러가지 작업을 통해서 얻을 수 있는 결과를
쉽게 할 수 있도록 도와주는 확장 기능이다.
파라미터 확장은 변수 확장이라고도 불린다.
일단 설명을 하고 맨 밑에서 한번에 실습할 것이다.
parameter
가 unset 또는 null 이면 word
를 되돌려준다.
parameter
가 unset 또는 null 이면 word
를 되돌려준다.
추가적으로 parameter
에 word
를 할당(=)한다.
참고로 위치 파라미터(ex: $1
, $2
)는 이게 먹히지 않는다.
parameter
가 unset 또는 null 이면 error message 를 작성하고 내용은 word
이다.
추가적으로 error message가 출력되면서 shell 은 exit 된다.
이때 bash의 exit code가 1이다.
parameter
가 값이 있으면, word
를 사용한다.
만약에 parameter
가 값이 있다면 null
을 반환한다.
1~4 까지를 보면서 가운데에 :
가 있다는 걸 알 수 있다.
그런데 저게 없는 경우도 종종 볼 수 있다.
그때는 약간의 의미가 달라진다.
:
가 있는 경우 : parameter
가 unset 또는 null 인지 검토:
가 없는 경우 : parameter
가 unset 인지만 검토#####################################################################
[dailycode@myComp:lab]$ unset var
[dailycode@myComp:lab]$ echo $var
[dailycode@myComp:lab]$ echo ${var:-something}
something
[dailycode@myComp:lab]$ echo $var
[dailycode@myComp:lab]$ # something으로 대체해서 출력했지만, var에 할당되지 않았다.
#####################################################################
[dailycode@myComp:lab]$ echo ${var:=something}
something
[dailycode@myComp:lab]$ echo $var
something
[dailycode@myComp:lab]$ # something으로 대체해서 출력 + var 에 something 할당
#####################################################################
[dailycode@myComp:lab]$ unset var
[dailycode@myComp:lab]$ echo ${var:?no word found}
-bash: var: no word found
[dailycode@myComp:lab]$ var=10
[dailycode@myComp:lab]$ echo ${var:?no word found}
10
#####################################################################
[dailycode@myComp:lab]$ var=10
[dailycode@myComp:lab]$ echo ${var:+good}
good
[dailycode@myComp:lab]$ unset var
[dailycode@myComp:lab]$ echo ${var:+good}
[dailycode@myComp:lab]$
추가 실습
간단한 쉘 스크립트 작성 후에, 정말 echo ${parameter:?word}
가 걸리게 되면
exit 되는지 확인해보자.
[dailycode@myComp:lab]$ vim b.sh
[dailycode@myComp:lab]$ cat b.sh
#!/bin/bash
echo ${1:?there is no parmaeter} 1> /dev/null # 정상 출력은 그냥 버린다.
echo "your parameter is ${1}" # 만약 위에서 잡히면 이 문자열이 출력되지 않는다.
exit 0
[dailycode@myComp:lab]$ ./b.sh
./b.sh: line 3: 1: there is no parmaeter # stderr 에 문구 출력
[dailycode@myComp:lab]$ ./b.sh good
your parameter is good
가끔 우리는 문자열에서 보이는 여러 패턴을 변경하거나,
특정 패턴의 문자열로 하나의 문자만 출력하거나 하는 일을 한다.
파라미터 확장은 이런 기능을 제공한다. 한번 맛보자.
파라미터 확장에서 사용되는 패턴의 의미는 다음과 같다
?(pattern-list)
Matches zero or one occurrence of the given patterns.
*(pattern-list)
Matches zero or more occurrences of the given patterns.
+(pattern-list)
Matches one or more occurrences of the given patterns.
@(pattern-list)
Matches one of the given patterns.
!(pattern-list)
Matches anything except one of the given patterns.더 자세한 내용은 여기를 참고하자.
#
는 앞에서부터 패턴을 찾아간다.
#
는 최소로만 찾고, ##
는 최대로 찾는다.
패턴에 매칭된 부분은 제거된다.
%
는 맨 뒤에서부터 패턴을 찾아간다.
%
는 최소로만 찾고, %%
는 최대로 찾는다.
패턴에 매칭된 부분은 제거된다.
//
는 특정 패턴의 문자열을 다른 문자열로 대체하는데 사용한다.
사용법은 ${parameter//[대체할 문자열]/[대체될 문자열]}
이다.
[dailycode@myComp:lab]$ var="hello:is:every:thing:ok?"
[dailycode@myComp:lab]$ echo $var
hello:is:every:thing:ok? # 앞으로 저 : 를 패턴으로 지정하여 문자열 조작을 할 것이다.
[dailycode@myComp:lab]$ echo ${var#*:}
is:every:thing:ok?
[dailycode@myComp:lab]$ echo ${var##*:}
ok?
[dailycode@myComp:lab]$ echo ${var%:*}
hello:is:every:thing
[dailycode@myComp:lab]$ echo ${var%%:*}
hello
[dailycode@myComp:lab]$ echo -e ${var//:/\\n}
hello
is
every
thing
ok?
[dailycode@myComp:lab]$ echo ${var} # 참고로 원본 문자열은 어떤 변경도 일어나지 않는다.
hello:is:every:thing:ok?
사실 위에서 정리한 내용은 내가 필요한 것만 정리한 것이다.
저것 외에도 파라미터 확장의 기능은 굉장히 많다.
나머지는 아래 링크를 참고하자. 둘 중 하나만 참고해도 충분하다.
https://mug896.github.io/bash-shell/exp_and_sub/parameter_expansion.html
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
이후에 내게도 더 필요한 내용이 있다면 이 게시물에 추가할 예정이다.