[Shell Script] 함수 만들기
아래 포스팅으로 AWS Cli에서 ELB를 Detach, Attach 하는 경우를 알아봤었는데,
ELB의 타겟에 여러개의 인스턴스가 있는 경우에 함수를 사용하는 것이 효율적이라고 생각했다.
Shell Script에서 함수 생성하기
함수를 생성하는 방식은 두가지가 있다.
1. 코드 블록에 함수 이름을 지정하는 키워드 함수
function test {
echo "test"
}
2. 함수 이름을 바로 지정하는 함수
test() {
echo "test"
}
⚠ 쉘 스크립트에서 함수를 사용할 때 주의할 점은 다음과 같다.
- 함수를 사용하기 전에 함수가 정의되어 있어야 한다.
- 함수를 다시 정의하게 되면 이전에 만들어진 함수의 정의를 덮어쓰게된다.
* Shell Script 상에서는 아무런 오류 메시지 없이 원래 함수의 정의를 덮어씌우므로 주의해야한다.
Shell 함수의 리턴 값
기본적으로 함수의 종료 상태는 함수의 마지막 명령의 종료상태를 되돌려준다.
1. return 값 지정
return 함수를 사용하여 함수의 종료 상태를 정의하는 단일 정수값을 지정할 수 있다.
return으로 종료 상태를 리턴하는 경우엔 해당 값은 0~255의 정수 범위 안에 있어야한다.
test() {
read -p "Enter a Value: " value
return $[ $value * 2 ]
}
test
echo "Value is $?"
결과
Enter a Value: 2
Value is 4
2. 함수의 출력 이용하기
함수의 출력을 쉘 변수에 저장하여 사용한다.
실수/문자열도 모두 사용이 가능하다.
test() {
read -p "Enter a Value: " value
echo $[ $value * 2 ]
}
result=$(test)
echo "Value is $result"
결과
Enter a Value: 2
Value is 4
매개 변수 사용하기
shell 함수의 매개변수는 함수명 뒤의 인자들을 공백으로 구분하여 나열하면 인자를 전달 할 수 있다.
test() {
value=$1
echo $[ $value * 2 ]
}
result=$(test 2)
echo "Value is $result"
결과
Value is 4
인스턴스의 Private IP를 가져오는 함수
위 방식들을 조합하여 ELB 타겟 인스턴스의 Private IP를 가져올 수 있는 함수를 생성해보자
인스턴스 ID를 매개변수로 받는 함수를 생성한다.
get_ip()
{
Private_ip=$(aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" \
"Name=instance-id,Values=$1" \
--query 'Reservations[*].Instances[*].[PrivateIpAddress]' \
--output text)
echo ${Private_ip}
}
ELB의 인스턴스 ID를 리스트 형태로 저장한다.
Instance=`aws elb describe-load-balancers \
--load-balancer-names ${ELB_NAME} --query \
'LoadBalancerDescriptions[].Instances[].{Id: InstanceId}' --output text`
그 후 타겟 인스턴스의 수만큼 반복문을 돌리면서 Private IP 변수에 저장
for Instance_id in $Instance; do
Private_ip=$(get_ip $Instance_id)
done
참고
https://m31phy.tistory.com/239
https://young-cow.tistory.com/34
'🌏 OS > Linux' 카테고리의 다른 글
[Linux] 숨김 파일 용량 확인 (0) | 2023.11.01 |
---|---|
[Shell Script] 배열 (array) 사용하기 (1) | 2023.10.30 |
[Linux] Curl 명령어 사용 시 진행 내용 가져오지 않기 (0) | 2023.10.24 |
[Linux] 에러 : Pseudo-terminal will not be allocated because stdin is not a terminal (1) | 2023.10.23 |
[Linux] HTTP Status Code 확인 (0) | 2023.10.19 |