본문 바로가기

Linux/쉘스크립트

매개변수 치환(Parameter Substitution)

변수를 조작하거나 확장시키기

${parameter}

변수인 parameter의 값이란 뜻으로서, $parameter라고 한 것과 같습니다. 어떤 문맥에서는 ${parameter}라고 확실히 써 줘야 동작하는 수도 있습니다.

문자열 변수들을 연결할 때 쓰일 수 있습니다.

your_id=${USER}-on-${HOSTNAME}
echo "$your_id"
#
echo "Old \$PATH = $PATH"
PATH=${PATH}:/opt/bin  # 스크립트가 도는 동안 $PATH 에 /opt/bin 을 추가.
echo "New \$PATH = $PATH"
${parameter-default}

매개변수가 세트되지 않았다면 default를 사용합니다.

echo ${username-`whoami`}
# $username이 여전히 세트되어 있지 않다면 `whoami`의 결과를 에코.

참고: 이렇게 하면 ${parameter:-default}라고 하는 것과 거의 비슷하지만 :이 있을 때는 매개변수가 선언만 되어 값이 널일 경우에도 기본값을 적용시킵니다.

#!/bin/bash

username0=
# username0 는 선언만 되고 널로 세트됐습니다.
echo "username0 = ${username0-`whoami`}"
# 에코 되지 않습니다.

echo "username1 = ${username1-`whoami`}"
# username1 는 선언되지 않았습니다.
# 에코 됩니다.

username2=
# username2 는 선언만 되고 널고 세트됐습니다.
echo "username2 = ${username2:-`whoami`}"
# 조건 테스트시 - 가 아니고 :- 를 썼기 때문에 에코 됩니다.

exit 0
${parameter=default}${parameter:=default}

매개변수가 세트 되어 있지 않다면 기본값으로 세트.

두 형태는 거의 비슷하지만 :이 있을 때는 위의 경우처럼 $parameter가 선언만 되고 값이 널일 경우에도 기본값으로 세트 시킨다는 차이점이 있습니다 [1]

echo ${username=`whoami`}
# "username" 변수를 `whoami`의 결과로 세트.


[root@Hoyoung 0514]# echo $OS

[root@Hoyoung 0514]# echo ${OS-LINUX}

LINUX

[root@Hoyoung 0514]# echo $OS

[root@Hoyoung 0514]# echo ${OS=LINUX}

LINUX

[root@Hoyoung 0514]# echo $OS

LINUX

[root@Hoyoung 0514]# unset OS

[root@Hoyoung 0514]# echo $OS

[root@Hoyoung 0514]# 



${#var}

문자열 길이 ($var의 문자 갯수). 배열의 경우에, ${#array}라고 하면 배열의 첫번째 요소의 길이를 알려줍니다.

참고: 예외:

  • ${#*} 와 ${#@} 는 위치 매개변수의 갯수를 알려줍니다.

  • 배열에 대해 ${#array[*]} 나 ${#array[@]} 라고 하면 배열 요소의 갯수를 알려줍니다.

예 9-11. 변수의 길이

#!/bin/bash
# length.sh

E_NO_ARGS=65

if [ $# -eq 0 ]  # 이 스크립트에서는 명령어줄 인자가 필요합니다.
then
  echo "하나 이상의 명령어줄 인자가 필요합니다."
  exit $E_NO_ARGS
fi  

var01=abcdEFGH28ij

echo "var01 = ${var01}"
echo "var01 의 길이 = ${#var01}"

echo "스크립트로 넘어온 명령어줄 인자 갯수 = ${#@}"
echo "스크립트로 넘어온 명령어줄 인자 갯수 = ${#*}"

exit 0


${var#pattern}${var##pattern}

$pattern이 $var의 앞 부분과 가장 길거나 가장 짧게 일치하는 부분을 삭제.

예 A-6에서 발췌한 사용법 예제:

# "days-between.sh" 예제에서 쓰인 함수.
# 주어진 인자의 앞 부분에 들어있는 하나 이상의 0 을 삭제.

strip_leading_zero () # 날짜나 월의 앞 부분에 나오는 0을 삭제하지 않으면 
{                     # Bash 가 8진수로 해석하기 때문에(POSIX.2, sect 2.9.2.1)
  val=${1#0}          # 이렇게 해 주는게 좋습니다.
  return $val
}

다른 사용법 예제:

echo `basename $PWD` # 현재 디렉토리의 basename. echo "${PWD##*/}" # 현재 디렉토리의 basename. // 가장 마지막에 만나는 echo // '/' 까지 삭제 echo `basename $0` # 스크립트 이름. echo $0 # 스크립트 이름. echo "${0##*/}" # 스크립트 이름. echo filename=test.data echo "${filename##*.}" # 데이타 # 전체 파일이름에서 확장자.

${var%pattern}${var%%pattern}

$pattern이 $var의 뒷 부분과 가장 짧거나 가장 길게 일치하는 부분을 삭제.

Bash 버전 2에는 옵션이 더 늘었습니다.

예 9-12. 매개변수 치환에서의 패턴 매칭

#!/bin/bash
# 매개변수 치환 연산자인 # ## % %% 를 써서 패턴 매칭하기.

var1=abcd12345abc6789
pattern1=a*c  # * (와일드 카드)는 a 와 c 사이의 모든 문자와 일치합니다.

echo
echo "var1 = $var1"           # abcd12345abc6789
echo "var1 = ${var1}"         # abcd12345abc6789   (다른 형태)
echo "${var1} 에 들어 있는 글자수 = ${#var1}"
echo "pattern1 = $pattern1"   # a*c  ('a'와 'c' 사이의 모든 문자)
echo


echo '${var1#$pattern1}  =' "${var1#$pattern1}"    #         d12345abc6789
# 앞에서부터 가장 짧게 일치하는 3 글자를 삭제             abcd12345abc6789
# ^^^^^^^^^^                                              |-|
echo '${var1##$pattern1} =' "${var1##$pattern1}"   #                  6789      
# 앞에서부터 가장 길게 일치하는 12 글자를 삭제            abcd12345abc6789
# ^^^^^^^^^^                                              |----------|

echo; echo

pattern2=b*9            # 'b'와 '9' 사이의 모든 문자.
echo "var1 = $var1"     # abcd12345abc6789 를 계속 씁니다.
echo "pattern2 = $pattern2"
echo

echo '${var1%pattern2}  =' "${var1%$pattern2}"     #     abcd12345a
# 뒤에서부터 가장 짧게 일치하는 6 글자를 삭제            abcd12345abc6789
# ^^^^^^^^^^                                                       |----|
echo '${var1%%pattern2} =' "${var1%%$pattern2}"    #     a
# 뒤에서부터 가장 길게 일치하는 12 글자를 삭제           abcd12345abc6789
# ^^^^^^^^^^                                              |-------------|

# 이렇게 외우세요.
#           # 과 ## 은 문자열의 앞쪽에서부터 동작을 하고,
#           % 와 %% 는 뒤쪽에서부터 동작을 합니다.

echo

exit 0


'Linux > 쉘스크립트' 카테고리의 다른 글

I/O 재지향  (0) 2015.05.14
변수 타입 지정: declare 나 typeset  (0) 2015.05.14
문자열 조작  (0) 2015.05.13
내부 변수(Internal Variables)  (0) 2015.05.12
until과 위치 매개변수 사용  (0) 2015.05.11