Bash 스크립팅 입문
Alex Scriven
Data Scientist
함수에 인수를 전달하는 방법은 스크립트에 전달하는 것과 유사합니다. $1 표기법을 사용합니다.
이전에 다룬 특별한 ARGV 속성도 사용할 수 있습니다:
$1, $2 표기법으로 접근합니다.$@와 $*는 ARGV의 모든 인수를 제공합니다.$#는 인수의 개수입니다.예시로 파일 이름들을 인수로 함수에 넘겨 보겠습니다. 루프를 돌며 출력하겠습니다.
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
프로그래밍에서 '스코프'는 변수를 어디까지 접근할 수 있는지를 뜻합니다.
왜 중요할까요? 지역 스코프만 가진 것을 밖에서 접근하면 오류로 실패할 수 있습니다!
대부분의 언어(Python, R 등)와 달리 Bash에서는 모든 변수가 기본적으로 전역입니다.
function print_filename { first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt
전역 스코프는 의도치 않은 동작 위험이 커서 위험할 수 있습니다. 주의하세요.
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의 return은 함수 성공(0) 또는 실패(1~255)을 나타내기만 합니다. 전역 변수 $?에 저장됩니다.
선택지는 다음과 같습니다.
echo로 출력 후 서브셸로 캡처반환 오류를 보겠습니다:
function function_2 { echlo # 'echo' 오타로 인한 오류 }function_2 # 함수 호출 echo $? # 반환값 출력
script.sh: line 2: echlo: command not found
127
무슨 일이었나요?
$?의 반환값은 127(오류)이었습니다.이제 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 스크립팅 입문