[점검]
명령 실행의 결과를 변수에 담기
1. a=$(date)
2. a='date'
- expr 1 + 5
- $[1 + 5]
참고로 에 대해서는 패턴 과 혼통의 우려로 인하여 \를 붙여서 처리한다.
bc -> bash에서 사용하는 계산기
scale은 소수점 몇자리 까지 표현할 것인가 나타냄
[root@yangseunghyun 0727]# b=$(echo "scale=2; 3.14*3.3"|bc) [root@yangseunghyun 0727]# echo $b 10.36
if [조건식] 또는 if 명령 > /dev/null then else fi
- 문자열 : "a" = "a", -z "문자열 또는 변수" -n
- 숫자 : 수식1 -eq 수식2(또는변수)
- 파일/디렉토리 : -d 파일이름 -> 디렉토리이면 참, -w -> 파일인데 쓰기가능, -x ->실행가능
- 두가지 이상의 조건을 모두 만족하거나 하나만 만족하면 참!
[ 조건식 1 ] && [ 조건식2 ] [ 조건식 1 ] || [ 조건식2 ]
- 이중 대괄호(패턴사용가능하다)
[[ $USER == u* ]] && [[ $HOSTNAME == h* ]] <-- 사용가능 [[ $a == user1 ]] && [[ $b == gildong ]]
case $answer in gildong) echo "hi gildong" echo "hello" ;; chulsoo) echo "hi chulsoo" ;; *) // 나머지 echo "I don't know" ;; esac
[root@yangseunghyun 0727]# for test in $(cat /etc/passwd | grep user1)
> do echo $test; done
user1:x:1000:1000:user1:/home/user1:/bin/bash
[root@yangseunghyun 0727]# IFS=:
[root@yangseunghyun 0727]# set | grep IFS
IFS=:
[root@yangseunghyun 0727]# for test in $(cat /etc/passwd | grep user1); do echo $test; done
user1
x
1000
1000
user1
/home/user1
/bin/bash
[root@yangseunghyun 0727]# IFS=$' \t\n'
gawk
- 열을 추출
- 전체 데이터 출력
- 2번째열 출력
- BEGIN은 입력 값 없이 바로 출력
- F : 필드 구분 문자 지정.
- f : awk program 파일 경로 지정.
- v : awk program에서 사용될 특정 variable값 지정.
[root@yangseunghyun 0727]# gawk -F: 'BEGIN {print "REPORT"} {print $1} END{print "보고완료"}' /etc/passwd
- gawk 데이터 추출 및 데이터 유효성 검사를 위하여 활용된다.
echo "this is a test" | gawk '/test/{print $0}'
- "this is a test" 를 gawk 에 입력값으로 넣어 test 와 동일한 문자열이 있다면 $0(전체) 를 출력하라
- gawk 는 정규표현식을 사용하여 패턴 검색 할 수 있다.
grep
- 해당 행 추출
[root@yangseunghyun 0727]# cat db.txt | name | age | addr | gildong | 24 | 용인 | chulsoo | 23 | 서울
[root@yangseunghyun 0727]# cat db.txt | grep -v name | gildong | 24 | 용인 | chulsoo | 23 | 서울
- name 라인 지우기
[root@yangseunghyun 0727]# cat db.txt | grep gildong | gildong | 24 | 용인
- 길동 라인 출력
[root@yangseunghyun 0727]# cat db.txt | grep gildong | gawk '{print $2}' gildong
- 2번째 출력
[root@yangseunghyun 0727]# cat db.txt | sed '/^$/d' | name | age | addr | gildong | 24 | 용인 | chulsoo | 23 | 서울
- 빈 줄 지우기
[root@yangseunghyun 0727]# for (( i=1; i<=3; i++ )); do echo $i; done 1 2 3
- while 은 조건이 참이라면 계속해서 반복해라. 참인동안은 반복해라
while [ 1 ] do echo "이것이 리눅스다.." done
- 우리는 메뉴생성시 종료없이 계속해서 메뉴의 내용을 출력하고자 하는 경우 주로 사용한다.
[root@yangseunghyun 0727]# cat test1.sh #!/bin/bash var1=10 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] done
예) 인스턴스의 이름? : test -> $name
인스턴스의 개수? : 3 -> $num
test-1
test-2
test-3for (( i=1; i<=$num; i++ )) do virt-install --name ${name}-${i} .... done echo "인스턴스 $i 개가 정상적으로 생성되었습니다"
키이름? : test -> ssh-keygen -q -f test.pem -N ""
test.pem , test.pem.pub
[root@yangseunghyun 0727]# vi test1.sh [root@yangseunghyun 0727]# ./test1.sh 10 9 8 7 6 5 4 3 2 1
[root@yangseunghyun 0727]# cat test1.sh #!/bin/bash read -s -p "비밀번호 : " pass echo while [ $pass != "1234" ] do echo "잘못된 패스워드 입니다" read -s -p "비밀번호 : " pass echo done echo "로그인 성공"
- 반복문의 한 종류로 주로 메뉴 생성에 사용된다.
select 변수명 in 리스트 do 명령 or 변수 done
- 사용자로부터 값을 받기 위해서는 프롬프트가 필요하다.
PS1
- 쉘에서 명령 입력 행
[root@localhost ~ ]# root@localhost ~ #
PS2
[root@yangseunghyun 0727]# echo "hello " hello
#!/bin/bash
>
PS3="실행하고 싶은 명령을 선택하세요 : "
>
select comm in 'ls -l' date pwd exit
do
$comm
done
case $var in
#!/bin/bash PS3="실행하고 싶은 명령을 선택하세요 : " select comm in "디렉토리파일확인" "날짜확인" "위치확인" "종료" do case $comm in 디렉토리파일확인) ls -l ;; 날짜확인) date ;; 위치확인) pwd ;; 종료) exit ;; *) #위 외의 나머지 echo "잘못된 선택입니다";; esac done
- 원격지와의 통신 상태를 확인하기 위해 우리는 ping을 사용할 예정이다.
- www.google.com, www.naver.com, www.daum.com으로 ping을 보내기 위한 프로그램을 select와 case를 이용하여 구현해보자
1) 구글 2) 네이버 3) 다음
#!/bin/bash PS3="실행하고 싶은 명령을 선택하세요 : " select comm in "구글" "네이버" "다음" "종료" do case $comm in 구글) ping -c 3 www.google.com ;; 네이버) ping -c 3 www.naver.com ;; 다음) ping -c 3 www.daum.net ;; 종료) exit ;; *) #위 외의 나머지 echo "잘못된 선택입니다";; esac done
- 반복문 내에서 반복을 강제로 종료하고 프로그램을 종료하고자 한다면 break 를 사용할 수 있고
- 아래의 내용을 더이상 진행하지 않고 프로그램 상단으로 이동하려면 continue 를 사용할 수 있다.
break
[root@yangseunghyun 0727]# cat break1.sh #!/bin/bash for (( a=1; a < 4; a++ )) do echo "OUTER : $a" for (( b=1; b < 100; b++ )) do if [ $b -eq 5 ] then break fi echo " INNER : $b" done done
[root@yangseunghyun 0727]# cat break2.sh #!/bin/bash for (( a=1; a < 4; a++ )) do echo "OUTER : $a" for (( b=1; b < 100; b++ )) do if [ $b -gt 4 ] then break 2 fi echo " INNER : $b" done done
- break1과 2의 차이
continue
[root@yangseunghyun 0727]# cat continue.sh #!/bin/bash for (( i=1; i < 15; i++ )) do if [ $i -gt 5 ] && [ $i -lt 10 ] then continue fi echo "num : $i" done
$PATH
- 실행 파일의 위치를 지정하는 위치변수
$?
- 직전 샐행 명령이 오류인지 참인지를 판별하는 종료 코드("0"이면 true, 나머지는 모두 False)
hello hi nice to meet you -> gawk '{print $1}' -> print 명령어 a b c -> a:$1 -> a b c $* -> a b c 전체를 하나의 데이터로 취급 $@ -> a b c 각각의 데이터를 묶어서 처리 $# -> 매개변수의 개수 -> 3 $0 -> 제일 앞 명령어
- echo
echo -n "name? : "
read name
- read
read -p "name ? " first last [root@yangseunghyun 0726]# read -p "name? " first last name? 양 승현 [root@yangseunghyun 0726]# echo $first 양 [root@yangseunghyun 0726]# echo $last 승현
[root@yangseunghyun 0727]# read -t 3 -p "name? : " name
- 3초 이내에 변수에 값이 담겨야 한다. 그렇지 않으면 종료 된다.
-p
- 프롬프트
글자수 제한 => 입력되는 글자수가 채워지면 종료[root@yangseunghyun 0727]# read -n1 -p "yes or no: " ans
- 한글자만 받는다
[root@yangseunghyun 0727]# read -s -p "yes or no: " ans yes or no: [root@yangseunghyun 0727]# echo $ans yes
- 입력된 값이 보이지 않는다
- 패스워드와 같이 입력되는 글자를 표시하고 싶지않다면? secure => -s
[확인하고 싶은 것]
- 가상 머신의 IP 주소 : virsh domifaddr test1
[root@yangseunghyun 0727]# virsh domifaddr test1 | grep -v Name | gawk '{print $4}' | sed '/^$/d' | gawk -F/ '{print $1}' 192.168.122.201
- IP 주소만 출력
- 현재 호스트 CPU 상태
top[root@yangseunghyun 0727]# yum -y install sysstat
- 가상 머신에 접속
[root@yangseunghyun 0727]# virsh console test1
가상머신들의 CPU 상태를 강제로 100% 로 만들기 위한 구성내용
가상머신으로 들어가서
yum clean all
yum update -y
yum -y install epel-release
yum -y install stress
stress -c 1 -> 가상머신의 CPU 가 100% 가 된다.ctrl+] 로 가상머신에서 호스트 로 이동하여
yum -y install virt-top
virt-top
- /usr/bin/allvm 의 내용을 확인하여 undefine은 인스턴스를 삭제하는 명령이다. 단, 인스턴스가 삭제되고 디스크는 여전히 /cloud 상에 남아 있게 된다. undefine 했을 때 함께 다음의 옵션을 추가하여 디스크까지 삭제되도록 해 보시오.
"--remove-all-storage"allvm undefine -> virsh undefine test1 --remove-all-storage
- 다음의 조건을 만족하는 스크립트를 작성하세요
인스턴스 생성 프로그램 설치할 이미지를 선택하세요: 1. CentOS7 2. Ubuntu18.04 선택 : 1 설치할 인스턴스의 이름을 입력하세요 : test 설치할 인스턴스의 개수 선택[1~4] : 3 CPU 개수 선택[1~4] : 1 메모리 사이즈 선택[1~4G] : 1 설치를 진행하겠습니다. [결과안내] test1의 IP 주소 : 192.168.112.201 test2의 IP 주소 : 192.168.112.202 현재 호스트의 CPU 사용률 : 23.03 % 설치가 완료되었습니다. 계속 진행하시려면 아무 키나 입력하세요 조건 : 잘못된, null 값이 입력되면 화면에는 "잘못된 입력입니다. 다시 입력하세요" 가 나오도록 해 주세요
while [ 1 ]
do
vmip=$(virsh domifaddr $instancename | grep -v Name | gawk '{print $4}' | sed '/^$/d' | gawk -F/ '{print $1}')
if [ -z $vmip ]
then
echo -n "#"
else
echo " 설치가 완료되었습니다"
break
fi
sleep 2
done
vi /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.3/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 yum clean all yum -y install MariaDB
vi /etc/my.cnf.d/server.cnf 파일에서
[mysqld] 섹션에 아래와 같은 내용을추가해 둔다.[mysqld]
init_connect="SET collation_connection=utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server=utf8
collation-server=utf8_general_ci[확인]
systemctl start mariadb
mysql -u root -p
[그냥 엔터]mariadb> status
virsh autostart test1
virsh destroy
잘 보고 있습니다!