[Bash] Shell Parameter Expansion

식빵·2022년 2월 27일
0

Bash Reference

목록 보기
1/3
post-thumbnail

참고: Shell Expansion 이란?
Shell Expansion은 쉘에서 프로그램을 실행하기 전에 입력 받은 문자들 중에서
약속된 특수 문자들을 추려내서 정해진 의미로 재해석하여 입력, 출력하는 것이다.

참고: Shell Expansion 에는 뭐가 있는가?

  • Brace expansion
  • Tilde expansion
  • Parameter expansion
  • command substitution
  • word splitting
  • filename expansion

이 글에서 정리하고자 하는 것은 Parameter expansion이다



🍀 Parameter expansion

우리가 어떤 파리미터(또는 변수)에 여러가지 작업을 통해서 얻을 수 있는 결과를
쉽게 할 수 있도록 도와주는 확장 기능이다.
파라미터 확장은 변수 확장이라고도 불린다.


📌 문자열 대체 기능

일단 설명을 하고 맨 밑에서 한번에 실습할 것이다.

${parameter:-word}

parameter 가 unset 또는 null 이면 word를 되돌려준다.


${parameter:=word}

parameter 가 unset 또는 null 이면 word를 되돌려준다.
추가적으로 parameterword 를 할당(=)한다.

참고로 위치 파라미터(ex: $1, $2)는 이게 먹히지 않는다.


${parameter:?word}

parameter 가 unset 또는 null 이면 error message 를 작성하고 내용은 word이다.
추가적으로 error message가 출력되면서 shell 은 exit 된다.
이때 bash의 exit code가 1이다.


${parameter:+word}

parameter 가 값이 있으면, word를 사용한다.
만약에 parameter 가 값이 있다면 null 을 반환한다.


참고) ":" 의 유무에 따른 의미차이

1~4 까지를 보면서 가운데에 : 가 있다는 걸 알 수 있다.
그런데 저게 없는 경우도 종종 볼 수 있다.

그때는 약간의 의미가 달라진다.

  • :있는 경우 : parameter 가 unset 또는 null 인지 검토
  • :없는 경우 : parameterunset 인지만 검토

실습

#####################################################################

[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#}, ${parameter##}

# 는 앞에서부터 패턴을 찾아간다.
# 는 최소로만 찾고, ## 는 최대로 찾는다.
패턴에 매칭된 부분은 제거된다.


${parameter%}, ${parameter%%}

% 는 맨 뒤에서부터 패턴을 찾아간다.
% 는 최소로만 찾고, %% 는 최대로 찾는다.
패턴에 매칭된 부분은 제거된다.


${parameter//}

// 는 특정 패턴의 문자열을 다른 문자열로 대체하는데 사용한다.
사용법은 ${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?





🍀 이외의 기능들

사실 위에서 정리한 내용은 내가 필요한 것만 정리한 것이다.
저것 외에도 파라미터 확장의 기능은 굉장히 많다.
나머지는 아래 링크를 참고하자. 둘 중 하나만 참고해도 충분하다.

이후에 내게도 더 필요한 내용이 있다면 이 게시물에 추가할 예정이다.

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글