- 2. 쉘 프로그래밍2023년 03월 29일 11시 31분 42초에 업로드 된 글입니다.작성자: 각수짱728x90반응형SMALL
쉘 프로그래밍
기본적으로 시스템 명령어와 프로그래밍 구문으로 이루어져 있다.
쉘 프로그래밍은 반복적인 작업을 자동화할 수 있다.
스크립트 실행
sh 명령어
sh [파일 이름]
chmod 명령어
chmod 755 [파일이름] ./[파일 이름]
변수
영어로는 Variable로 (문자나 숫자 같은) 값을 담는 컨테이너다.
여기에 담긴 값은 다른 값으로 바꿀 수 있다.
변수명=값환경 변수
시스템 환경과 관련한 정보를 저장하는 변수.
시스템에 기본적으로 설정이 되어있지만 사용자에 의해 변경이 가능하다.
변수명이 전부 대문자PATH : 쉘이 명령어의 실행 파일을 찾을 때 참조하는 디렉터리 경로
PS1 : 쉘 프롬프트 모양사용자 정의 변수
일반적으로 사용자가 프로그래밍할 때 사용하는 변수
변수명에 문자, 숫자, _ 을 사용할 수 있으며 변수명의 첫 문자는 반드시 문자 또는 _특수 변수
쉘 스크립트에서 특수한 의미를 가진 변수
현재 쉘의 PID, 실행된 마지막 백그라운드 명령의 프로세스 넘버위치 매개 변수
$1~ $9 , $0
ex)
ls -al /etc
$0 $1 $2변수 사용
변수에 들어있는 값을 사용할 때는 변수명 앞에 $를 붙여준다.
test=Hello echo $test
조건문
조건문은 사용자가 입력한 조건을 충족할 때(True) 또는 충족하지 못할 때(False)
각각 서로 다른 동작을 할 수 있도록 해주는 문법이다.기본 조건문
if [ 조건 ] // 대괄호+띄어쓰기 꼭 포함해야함 then 수행 명령어 fi
조건
문자열 검사
str1 = str2 문자열이 같으면 true, 다르면 false str1 != str2 문자열이 다르면 true, 같으면 false str 문자열이 비어있지 않으면 true, 비어있으면 false
Null산술 비교
A -eq B == A와 B가 같으면 true A -ne B != A와 B가 다르면 true A -gt B > A가 B보다 크면 true A -ge B >= A가 B보다 크거나 같으면 true A -lt B < A가 B보다 작으면 true A -le B <= A가 B보다 작거나 같으면 true 파일 검사
-d file 디렉토리이면 true -f file 일반 파일이면 true -l file 링크 파일이면 true -r file 읽기 가능하면 true -w file 쓰기 가능하면 true -x file 실행 가능하면 true -u file SetUID 설정 파일이면 true -g file SetGID 설정 파일이면 true -k file Sticky Bit 설정 파일이면 true 논리 조건 연산
! NOT연산 -a AND연산 -o OR 연산 나머지 조건문
if [ 조건 ] then 수행 명령어1 else 수행 명령어2 fi
추가 조건문
if [ 조건1 ] then 수행 명령어1 elif [ 조건2 ] then 수행 명령어2 else 수행 명령어3 fi
case문
case "$color" in 'red') echo "Color is Red" ;; 'blue' | 'sky') echo "Color is blue" ;; 'black') echo "Color is Black" ;; *) echo "NONE" ;; esac
사용자 입력
read 변수명
반복문
for
for 변수 in 1 2 3 4 // 값을 넣어줘도 됨 do 반복 될 명령어 done for 변수 in $(seq 5) // 5까지 순서대로 진행 do 반복 될 명령어 done
while
while [ 조건 ] do 반복 될 명령어 done
!/bin/bash var=5 while [ $var -lt 10 ] do echo $var var=`expr $var \+ 1` done
내부 명령어
exit 쉘 스크립트 종료 continue 반복문 돌 때 진행 중인 작업 중단하고 다시 반복문 처음으로 이동 break 반복문을 종료 done 다음 명령어 실행 return 함수 종료 시 결과 값 반환 read 표준 입력에서 입력 받아 변수에 할당 expr 수식의 결과 출력 0~100중에서 홀수만 더하기
더보기#!/bin/bash var=0 while [ $var -le 10 ] do var=`expr $var \+ 1` if [ $var -eq 5 ] then break fi echo $var done
활용
cut
-d : 구분자를 지정
-f : 몇 번째 필드인지 지정awk
-F: '{print $1}'
wc
-c : 문자의 수
-l : 라인 수sed
-i : 변경한 내용을 파일에 저장, i옵션을 안 쓰면 단순히 출력만 됨
sed 's/[패턴1]/[패턴2]/g' [파일] : 패턴 1을 패턴 2로 변경
sed '/[패턴]/d' [파일] : 패턴이 포함된 라인을 삭제
sed '/^$/d [파일] : 공백 라인 삭제 (아주 유용함)
예제
변수+조건문 사용
ex01.sh
#!/bin/bash var01=20 if [ $var01 -eq 10 ] then echo "같다" fi
명령어 실행 결과 변수에 저장하고 비교(1)
ex02.sh
#!/bin/bash result=`systemctl status redis | grep Active | awk -F" " '{print $2}'` echo $result if [ $result = "active" ] then echo "실행 됨" fi
명령어 실행 결과 변수에 저장해서 비교(2)
ex03.sh
#!/bin/bash result=`df -h | grep /dev/mapper/cs-root | awk -F" " '{print $5}' | cut -d"%" -f 1` echo $result if [ $result -gt 80 ] then echo "디스크 추가 필요" else echo "아무것도 안해도 됨" fi
반복문 사용
ex04.sh
#!/bin/bash servers=" 192.168.87.174 192.168.87.175 192.168.87.135 " for server in $servers do echo $server sshpass -p 'qwer1234' ssh root@$server 'cat /etc/hostname' done
스크립트 안에서 스크립트 사용
commands.sh
#!/bin/bash cat /etc/hostname df -h | grep /dev/mapper/cs-root // 디스크 사용량 free // 메모리 사용량
ex05.sh
#!/bin/bash servers=" 192.168.87.174 192.168.87.175 192.168.87.135 " for server in $servers do echo $server sshpass -p 'qwer1234' ssh root@$server < commands.sh done
활용
3대에 웹 서버 설치 후 실행 및 방화벽 설정 + 헬스체크 파일 생성
commands.sh
#!/bin/bash yum install -y httpd & wait // wait : 이 명령어가 끝날 때까지 기다려라 systemctl start httpd systemctl stop firewalld echo "ok" > /var/www/html/test.html
ex06.sh
#!/bin/bash servers=" 192.168.87.174 192.168.87.135 192.168.87.175 " for server in $servers do echo $server sshpass -p 'qwer1234' ssh root@$server < commands.sh echo "----------------------------done---------------------------" done
실행된 뒤에
test.html 페이지 접속 시 ok 확인
더보기<실습>
#!/bin/bash
total=`df -h | grep centos | cut -d" " -f4`
avail=`df -h | grep centos | awk -F" " '{print $4}'`
echo "Total Size is $total"
echo "Avail Size is $avail"
(3) 함수
fuction 함수이름() {
명령어들
}
함수 사용은 함수 이름을 쓰면 된다.
<1> 지역변수
함수 안에서 생성된 변수, 함수 안에서만 사용되는 변수
local 변수명
#!/bin/bash
var=1234
function test() {
local var=5678
echo "local variable is $var"
}
echo "before variable is $var"
test
echo "after variable is $var"
<2> 매개변수
#!/bin/bash
function test() {
local var=$1
echo "$var"
}
test 1234
<3> 결과 전달받기
#!/bin/bash
function test() {
local var=$1
echo "$var"
}
result=$(test argv)
echo $result
<4> 반환
#!/bin/bash
function test() {
return 10
}
test
result=$?
echo $result
(4) 스크립트 안에서 스크립트 사용
ㅈㄱㄴ
i=0
flag=0
total=0
for test in `awk -F"," '{print $4 "-" $8}' 2020 | awk -F"-" '{print $1 " " $3}'`
do
i=`expr $i + 1`
if [ $flag = 1 ]
then
echo $test
total=`expr $total + $test`
flag=0
fi
if [ `expr $i % 3` = 1 -a $test -ge 20 -a $test -lt 30 ]
then
echo "age is $test"
flag=1
fi
if [ `expr $i % 3` = 0 ]
then
continue
fi
done
echo "======================"
echo "Total is $total"
echo "======================"
yum install httpd -y & wait728x90반응형LIST'IaC' 카테고리의 다른 글
4. Terraform(테라폼) (0) 2023.03.30 Ansible(앤서블) - 활용(3계층구현) (0) 2023.03.29 3. Ansible(앤서블) (0) 2023.03.29 쉘 프로그래밍 - 활용 (0) 2023.03.29 1. IaC (0) 2023.03.28 이전글이 없습니다.댓글