리눅스 쉘 기본 정리3

양승현·2022년 7월 27일
1

linux

목록 보기
11/20

[점검]
명령 실행의 결과를 변수에 담기
1. a=$(date)
2. a='date'

계산하기

  1. expr 1 + 5
  2. $[1 + 5]
  • 참고로 에 대해서는 패턴 과 혼통의 우려로 인하여 \를 붙여서 처리한다.

  • bc -> bash에서 사용하는 계산기

  • scale은 소수점 몇자리 까지 표현할 것인가 나타냄

[root@yangseunghyun 0727]# b=$(echo "scale=2; 3.14*3.3"|bc)
[root@yangseunghyun 0727]# echo $b
10.36

조건문

1. if

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

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, grep

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 | 서울
  • 빈 줄 지우기

for

[root@yangseunghyun 0727]# for (( i=1; i<=3; i++ )); do echo $i; done
1
2
3

while

  • 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-3

for (( 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 명령과 메뉴

  • 반복문의 한 종류로 주로 메뉴 생성에 사용된다.
select 변수명 in 리스트
do 
	명령 or 변수
done
  • 사용자로부터 값을 받기 위해서는 프롬프트가 필요하다.

PS1

  • 쉘에서 명령 입력 행
[root@localhost ~ ]# root@localhost ~ #

PS2

[root@yangseunghyun 0727]# echo "hello
"
hello

PS3

  • 메뉴를 출력하고 메뉴에서 선택하도록 프롬프트를 띄운다.
#!/bin/bash
>
PS3="실행하고 싶은 명령을 선택하세요 : "
>
select comm in 'ls -l' date pwd exit
do
        $comm
done

  • select를 단독으로 사용하면 명령을 그대로 나열해야 하므로 case와 함께 사용하면 효율적이다.

case $var in

#!/bin/bash

PS3="실행하고 싶은 명령을 선택하세요 : "

select comm in "디렉토리파일확인" "날짜확인" "위치확인" "종료"
do
        case $comm in
        디렉토리파일확인)
                ls -l ;;
        날짜확인)
                date ;;
        위치확인)
                pwd ;;
        종료)
                exit ;;
        *) #위 외의 나머지
                echo "잘못된 선택입니다";;
        esac
done

quiz.

  • 원격지와의 통신 상태를 확인하기 위해 우리는 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 를 사용할 수 있고
  • 아래의 내용을 더이상 진행하지 않고 프로그램 상단으로 이동하려면 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  -> 제일 앞 명령어

[ 사용자 입력 받기 ]

  1. echo
    echo -n "name? : "
    read name
  1. 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


[확인하고 싶은 것]

    1. 가상 머신의 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 주소만 출력
    1. 현재 호스트 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

[ 실습 ]

    1. /usr/bin/allvm 의 내용을 확인하여 undefine은 인스턴스를 삭제하는 명령이다. 단, 인스턴스가 삭제되고 디스크는 여전히 /cloud 상에 남아 있게 된다. undefine 했을 때 함께 다음의 옵션을 추가하여 디스크까지 삭제되도록 해 보시오.
      "--remove-all-storage"

allvm undefine -> virsh undefine test1 --remove-all-storage

    1. 다음의 조건을 만족하는 스크립트를 작성하세요
    인스턴스 생성 프로그램

설치할 이미지를 선택하세요:
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

MariaDB 10.3 설치하기

 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

1개의 댓글

comment-user-thumbnail
2022년 7월 28일

잘 보고 있습니다!

답글 달기