Shell Script/Bash Shell

Quotes, Variables, Functions 개념 및 사용

Quotes

Shell 에서 두 번째로 중요한 개념은 quotes 이라고 할 수 있습니다. shell 에서 quotes 은 숫자나 스트링 값을 구분하기 위한 용도로 사용하지 않습니다. 123, "123", '123' 은 모두 같고 abc, "abc", 'abc' 들은 차이가 없으며 모두 다 shell 에서는 스트링입니다.

 

  • 공백으로 분리되는 여러 개의 스트링을 하나의 인수로 만들 때
    ( sed, awk 스크립트를 quotes 을 이용해 작성하는 이유가 하나의 인수로 만들기 위해서입니다. )
  • 라인 개행이나 둘 이상의 공백을 유지하기 위해
  • 단어분리, globbing 발생을 방지하기 위해
  • shell 키워드, 메타문자, alias 와 같이 shell 에서 특수기능을 하는 문자, 단어를 단순히 명령문의 스트링으로 만들기위해
  • 문자 그대로 스트링을 강조하기 위해

 

Variables

변수 이름은 알파벳 (대, 소문자), 숫자, _ 로 만들 수 있으며 이름의 첫 문자로 숫자가 올 수 없습니다. 변수이름을 대문자로 사용할때는 shell 환경변수와 중복되지 않도록 주의해야 합니다.

ORIGINAL_FILE=myfile

FILE_PREFIX=$ORIGINAL_FILE.split        # '.' 사용
FILE_PREFIX=$ORIGINAL_FILE-split        # '-' 사용

현재 shell 에 정의된 모든 변수명 보기

$ compgen -A variable

# 현재 shell 에 특정 변수가 설정되어 있는지 간단히 확인하는 방법
# 가령 대문자 B 로 시작하는 변수를 조회하려면
$ $B[tab]

정의된 변수 삭제하기

# unset 명령 실행시 옵션을 주지 않으면 첫번째로 변수를 unset 시도하고
# 실패할 경우 함수를 unset 시도합니다.
$ unset 변수명

 

Functions

{ ;}, ( ) 를 이용해 명령 그룹을 만들게 되면 같은 context 에서 실행이 됩니다. 이것은 명령 그룹 전체가 하나의 명령처럼 실행되는 것과 같은 효과가 있습니다. 따라서 앞에 함수명을 붙여서 함수 정의를 하게 되면 일반 명령과 동일하게 사용될 수 있습니다.

# 명령 그룹을 하나의 짧은 이름으로 사용 ( 함수정의 ) 
{ 
    read var1
    read var2
    echo "$var1 $var2"
} < infile

f1() { 
    read var1
    read var2
    echo "$var1 $var2"
}           

$ f1 < infile

함수를 실행할 땐 먼저 정의가 되어 있어야 한다.

foo1            # 여기서는 foo1 함수 정의가 안되어있기 때문에 실행할 수 없다.

foo1() {
    echo "foo1"
    foo2        # foo1 함수를 실행한 곳이 foo2 아래이므로 실행 가능
}

foo2() {
    echo "foo2"
}

foo1            # 여기서는 foo1 함수를 실행할 수 있다.

조건에 따라 다른 함수를 정의할 수 있다.

if test -n "$KSH_VERSION"; then
    puts() {
        print -r -- "$*"
    }
else
    puts() {
        printf '%s\n' "$*"
    }
fi

함수에서 연산 결과를 리턴하는 방법

- 함수에서도 외부 명령과 동일하게 명령치환 을 사용

f1() { expr $1 + $2 ;}
f2() { date "+%Y" ;}
f3() { echo "hello $1" ;}

-------------------------

$ AA=$(f1 1 2)
$ echo $AA
3

$ AA=`f2`
$ echo $AA
2015

$ AA=$(f3 world)
$ echo $AA
hello world

'Shell Script > Bash Shell' 카테고리의 다른 글

Shell Script 간단 주의점  (0) 2021.07.02