"매개변수 확장"(Parameter Expansion) 이라는 용어가 맘에 안들긴 하지만, 다들 그렇게 부르니 그렇게 정리한다.

 

1. ${name}

name 변수의 값으로 치환한다.

 

2. ${name:=james}

name 변수의 값으로 치환하되, name 변수가 null이면 james 문자열을 name 변수에 저장한 후 치환한다.

 

3. ${name:-james}

name 변수의 값으로 치환하되, name 변수가 null이면 james 문자열로 치환한다.(저장X)

 

4. ${name:+james}

name 변수의 값으로 치환하되, name 변수가 null이 아니면 james 문자열로 치환한다.(name 변수가 null이면 그대로 null로 치환된다.)

 

5. ${name:?james}

name 변수의 값으로 치환하되, name 변수가 null이면 error상태로 종료되며 james 문자열을 보여준다.

 

6. ${#name}

name 변수의 값의 문자길이를 반환한다.

 

7. ${name:3}

name 변수의 값에서 3만큼 앞부분을 삭제한 후의 값을 반환한다.

e.g. 

name=abcdefg
echo ${name:3} # defg

 

8. ${name:3:2}

name 변수의 값에서 3만큼 앞부분을 삭제한 후의 값에서 앞의 2개 문자열을 반환한다.

e.g.

name=abcdefg
echo ${name:3:2} # de

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

조건문을 사용할 때 문자열 비교 표현식 결과를 판단하기 위해서 싱글브라켓과 더블브라켓을 사용하는데, 그 차이를 정리한다.

참고로, 브라켓을 사용할 때는 시작 브라켓 다음에 반드시 공백이 있어야 한다. (문자열 비교시)싱글브라켓은 test와 같은 기능이다. "=" 와 "==" 는 둘다 동일비교이며, bash 버전에 따라 "=" 를 지원하지 않는다고 한다.(걍 문자열 비교는 무조건 == 를 쓰자) 표현식 판단결과가 0이면 true이며, 1이면 false이다.

참고로, "-eq" 는 문자열 비교시가 아니라 숫자 비교를 test를 사용하여 비교할 때 쓰는 비교문이다.

 

1. 테스트 스크립트

test.sh

#!/bin/bash
name=root

# 1. 정확한 문자열 매칭 테스트
# test, 싱글브라켓, 더블브라켓 모두 동일하다.
test $name = root
echo '$name = root >>> '$?

test $name == root
echo '$name == root >>> '$?

[ $name = root ]
echo '[ $name = root ] >>> '$?

[ $name == root ]
echo '[ $name == root ] >>> '$?

[[ $name = root ]]
echo '[[ $name = root ]] >>> '$?

[[ $name == root ]]
echo '[[ $name == root ]] >>> '$?



# 2. 패턴 매칭 테스트
# 싱글브라켓, test는 패턴매칭이 안된다.
# 더블브라켓은 패턴매칭이 된다.
test $name = [Rr]???
echo 'test $name = [Rr]??? >>> '$?

test $name == [Rr]???
echo 'test $name == [Rr]??? >>> '$?

[ $name = [Rr]??? ]
echo '[ $name = [Rr]??? ] >>> '$?

[ $name == [Rr]??? ]
echo '[ $name == [Rr]??? ] >>> '$?

[[ $name = [Rr]??? ]]
echo '[[ $name = [Rr]??? ]] >>> '$?

[[ $name == [Rr]??? ]]
echo '[[ $name == [Rr]??? ]] >>> '$?

 

2. 실행결과

./test.sh

$name = root >>> 0
$name == root >>> 0
[ $name = root ] >>> 0
[ $name == root ] >>> 0
[[ $name = root ]] >>> 0
[[ $name == root ]] >>> 0
test $name = [Rr]??? >>> 1
test $name == [Rr]??? >>> 1
[ $name = [Rr]??? ] >>> 1
[ $name == [Rr]??? ] >>> 1
[[ $name = [Rr]??? ]] >>> 0
[[ $name == [Rr]??? ]] >>> 0

 

3. 정리

test 명령어와 싱글브라켓은 기능이 동일하며, 더블브라켓은 패턴매칭까지 지원한다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,