인수, 반환값, 스코프

Bash 스크립팅 입문

Alex Scriven

Data Scientist

Bash 함수에 인수 전달하기

함수에 인수를 전달하는 방법은 스크립트에 전달하는 것과 유사합니다. $1 표기법을 사용합니다.

이전에 다룬 특별한 ARGV 속성도 사용할 수 있습니다:

  • 각 인수는 $1, $2 표기법으로 접근합니다.
  • $@$*ARGV의 모든 인수를 제공합니다.
  • $#는 인수의 개수입니다.
Bash 스크립팅 입문

인수 전달 예시

예시로 파일 이름들을 인수로 함수에 넘겨 보겠습니다. 루프를 돌며 출력하겠습니다.

function print_filename {
    echo "The first file was $1"

for file in $@ do echo "This file has name $file" done }
print_filename "LOTR.txt" "mod.txt" "A.py"

 

 

 

The first file was LOTR.txt
This file has name LOTR.txt
This file has name mod.txt
This file has name A.py
Bash 스크립팅 입문

프로그래밍의 스코프

 

프로그래밍에서 '스코프'는 변수를 어디까지 접근할 수 있는지를 뜻합니다.

  • '전역'은 FOR, IF, 함수 등 프로그램 어디서나 접근 가능함을 의미합니다.
  • '지역'은 프로그램의 특정 부분에서만 접근 가능함을 의미합니다.

왜 중요할까요? 지역 스코프만 가진 것을 밖에서 접근하면 오류로 실패할 수 있습니다!

Bash 스크립팅 입문

Bash 함수의 스코프

대부분의 언어(Python, R 등)와 달리 Bash에서는 모든 변수가 기본적으로 전역입니다.

function print_filename {
    first_filename=$1
}

print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt

전역 스코프는 의도치 않은 동작 위험이 커서 위험할 수 있습니다. 주의하세요.

Bash 스크립팅 입문

Bash 함수에서 스코프 제한하기

local 키워드로 변수 스코프를 제한할 수 있습니다.

function print_filename {
    local first_filename=$1
}

print_filename "LOTR.txt" "model.txt" echo $first_filename


 

Q: 왜 오류가 아니라 빈 줄이었을까요?

A: first_filename전역 첫 ARGV 요소($1)에 할당되었기 때문입니다.

인수 없이 실행했기 때문에(bash script.sh) 기본적으로 빈 요소가 됩니다. 주의하세요!

Bash 스크립팅 입문

반환값

인수는 넣는 법을 알았습니다. 이제 꺼내는 법은?

Bash의 return은 함수 성공(0) 또는 실패(1~255)을 나타내기만 합니다. 전역 변수 $?에 저장됩니다.

선택지는 다음과 같습니다.

  1. 전역 변수에 할당
  2. 함수의 마지막 줄에서 echo로 출력 후 서브셸로 캡처
Bash 스크립팅 입문

반환 오류 예시

반환 오류를 보겠습니다:

function function_2 {
    echlo # 'echo' 오타로 인한 오류
}

function_2 # 함수 호출 echo $? # 반환값 출력
script.sh: line 2: echlo: command not found
127

무슨 일이었나요?

  1. 함수를 호출했을 때 오류가 발생했습니다.
    • 스크립트가 'echlo' 프로그램을 찾았지만 없었습니다.
  2. $?의 반환값은 127(오류)이었습니다.
Bash 스크립팅 입문

올바른 반환 방법

이제 echo와 서브셸 캡처로 스크립트 다른 곳에서 쓸 값을 올바르게 반환해 봅시다:

function convert_temp {
    echo $(echo "scale=2; ($1 - 32) * 5 / 9" | bc)
}

converted=$(convert_temp 30) echo "30F in Celsius is $converted C"
30F in Celsius is -1.11 C
  • 중간 변수를 더 이상 만들지 않는 점을 보세요.
Bash 스크립팅 입문

연습해 봅시다!

Bash 스크립팅 입문

Preparing Video For Download...