변수를 조작하거나 확장시키기
- ${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의 문자 갯수). 배열의 경우에, ${#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 |
$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 } |
다른 사용법 예제:
|
- ${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 |