다음 두가지 방법으로 작성 가능
function name {
필요한 명령
}
name() {
필요한 명령들
}
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