[클라우드 With리눅스/쉘프로그래밍(10) - 함수, 메뉴만들기]

SooYeon Yeon·2022년 8월 22일

클라우드 With리눅스

목록 보기
35/39

함수

  • 다른 언어와 동일하게 미리 지정된 코드를 호출하여 사용하는 것
  • 코드를 간결하게 작성할 수 있다.
  • 함수는 반드시 입력과 출력이 있는 것은 아니다.

다음 두가지 방법으로 작성 가능

function name {
	필요한 명령
}
name() {
	필요한 명령들
}
  • return

return을 이용해 함수가 특정 종료 상태를 돌려 줄 수 있다.

function dbl {
	read -p "Enter a value: " value
	return $ [ $value * 2 ]
}
dbl
echo "The new value is $?"

echo를 이용할 수도 있다.

function dbl {
	read -p "Enter a value: " value
	echo $ [ $value * 2 ]
}
result=$(dbl)
echo "The new value is $result"

함수 내의 변수명과 함수 밖의 변수명이 동일하다면 이는 동일한 변수인가?

test2() {

}

test(){
a=.... #지역변수
}

echo $a

bash는 기본적으로 동일한 변수다

bash는 함수 내에서 사용하는 변수와 함수 밖의 변수명이 동일한 경우 이를 동일 변수로 취급한다. (다른 언어와 반대 → global, return)

기본이 전역이고, 이를 지역으로 전환하고자 한다면 local을 앞에 붙인다.

[root@sooyeon 0728]# cat test4.sh
#!/bin/bash

addem() {
        if [ $# -eq 0 ] || [ $# -gt 2 ]
        then
                echo "잘못된 입력 : 하나 또는 두 수를 입력"
        elif [ $# -eq 1 ]
        then
                echo $[ $1 + $1 ]
        else
                echo $[ $1 + $2 ]
        fi
}

echo -n " 10과 20의 합 : "
result1=$(addem 10 20)
echo $result1
echo -n " 10을 10과 더하면? "
result2=$(addem 10)
echo $result2

배열

배열은 변수 하나에 다수의 값을 포함시킬 수 있는 방법

[root@sooyeon 0728]# mytest=(one two three four five)
[root@sooyeon 0728]# echo $mytest
one
[root@sooyeon 0728]# echo ${mytest[0]}
one
[root@sooyeon 0728]# echo ${mytest[1]}
two
[root@sooyeon 0728]# echo ${mytest[*]}
one two three four five
  • 원소가 삭제되어도 빈칸으로 남고, 땡겨지지않음
[root@sooyeon 0728]# unset mytest[2]
[root@sooyeon 0728]# echo ${mytest[*]}
one two four five
[root@sooyeon 0728]# echo ${mytest[2]}

슬라이싱은 되지 않음

(사용자 모듈)라이브러리 만들기

[root@sooyeon 0728]# cat mylib
#!/bin/bash

addem() {
        echo $[ $1 + $2 ]
}

multem() {
        echo $[ $1 * $2 ]
}

[root@sooyeon 0728]# cat test10.sh
#!/bin/bash

#해당 위치 mylib
. ./mylib

value1=10
value2=20

result1=$(addem $value1 $value2) ; echo $result1
result2=$(multem $value1 $value2) ; echo $result2

[root@sooyeon 0728]# ./test10.sh
30
200

실습

접속할 DB HOST : 192.168.1.199

DB Name : mylab

TABLE : instance

user : testuser/test123

num값보낼때는 NULL로, 인스턴스이름, 인스턴스의 사설 주소,

-------------- 인스턴스 생성 ---------------------
#!/bin/bash

clear
echo -e "\t\t\t인스턴스 생성 프로그램 "
echo

# 설치할 이미지 선택

PS3="설치할 이미지를 선택하세요 : "
select comm in "CentOS7" "Ubuntu18.04"
do
        case $comm in
        CentOS7)
                name="CentOS7-Base.qcow2"
                break ;;
        Ubuntu18.04)
                name="Ubuntu1804.qcow2"
                break  ;;
        *)
                echo "잘못된 번호 선택. 다시 입력하세요." ;;
        esac
done

# 인스턴스 이름 입력
echo
echo -n "인스턴스 이름 입력 : "
read instancename

# 설치할 인스턴스 개수 선택
echo -n "설치할 인스턴스 개수 선택[1~4] : "
read num
while [ 1 ]
do
if [ $num -ge 1 ] && [ $num -le 4 ]
then
        break
else
        echo "잘못된 입력입니다. 다시 입력하세요"
        echo -n "설치할 인스턴스 개수 선택[1~4] : "
        read num
fi
done

echo
echo -n "CPU 개수 선택(1~4) : "
read vcpus
while [ 1 ]
do
if [ $vcpus -ge 1 ] && [ $vcpus -le 4 ]
then
        break
else
        echo "잘못된 입력입니다. 다시 입력하세요"
        echo -n "CPU 개수 선택 (1~4) : "
        read vcpus
fi
done

echo
echo -n "메모리 사이즈 선택(1~4GB) : "
read tempmem
while [ 1 ]
do
if [ $tempmem -ge 1 ] && [ $tempmem -le 4 ]
then
        break
else
        echo "잘못된 입력입니다. 다시 입력하세요"
        echo -n "메모리 사이즈 선택(1~4GB) : "
        read tempmem
fi
done
ram=$(expr $tempmem \* 1024 )

echo
echo "설치가 진행됩니다"

for (( i=1; i<=$num; i++ ))
do

cp /cloud/$name /cloud/${instancename}${i}.qcow2
#echo "$instancename$i $vcpus $ram"
virt-install --name ${instancename}${i} --vcpus $vcpus --ram $ram --network network:default,model=virtio --disk /cloud/${instancename}${i}.qcow2 --import --noautoconsole > /dev/null
done

echo "설치 완료"

#확인
virsh list --all

# 결과안내
var=$(sar 1 3 | tail -1 | gawk '{print $8}')
cpuutil=$(echo "scale=4; 100 - $var" | bc)

for (( i=1; i<$num+1; i++))
do
        while [ 1 ]
        do
        ip=$(virsh domifaddr ${instancename}${i} | grep -v Name | gawk '{print $4}' | sed '/^$/d' | gawk -F/ '{print $1}')

        if [ -z $ip ]
        then
                echo "#"
                sleep 3
        else

                echo
                echo "break됨"
                break
        fi
        done
        echo "${instancename}${i} 의 IP 주소 : $ip"
        mysql -h 192.168.1.199 -u testuser -ptest123 -e "INSERT INTO mylab.instance VALUES (NULL,'$instancename','$ip',$vcpus,$tempmem,'$HOSTNAME',$cpuutil)"
done

메뉴 만들기

[root@sooyeon 0728]# cat test11.sh
#!/bin/bash

# 함수 선언
diskspace(){
        clear
        df -h
}
whoseon(){
        clear
        who
}
meminfo(){
        clear
        cat /proc/meminfo
}

# 변수 선언

# 메인 코드

PS3="선택하세요 : "
select option in "디스크공간확인" "로그인정보확인" "메모리정보확인" "종료"
do
        case $option in
        디스크공간확인)
                diskspace ;;
        로그인정보확인)
                whoseon ;;
        메모리정보확인)
                meminfo ;;
        종료)
                break ;;
        *)
                clear
                echo "잘못된입력입니다" ;;
        esac
done
clear

0개의 댓글