07. Shell Script

정혜지·2022년 7월 21일
0

CS /Linux

목록 보기
11/13

Shell

사용자가 입력한 명령어 커널에게 전달될때 해석기

  • 해석기능, 프로그래밍 기능, 사용자 환경 변수 설정

쉘(shell) 개념

쉘은 사용자의 응용프로그램과 커널 사이에 위치한 명령어 해석기

쉘(shell)은 명령어를 받아 해석하여 커널(kernel)에게 전송 -> 커널은 명령 동작 수행, 그에 대한 결과를 사용자에게 전달하기휘애 다시 쉘에 응답을 보내고 쉘을 거쳐 사용자에게 도달


Shell script

Command line에서 특정 기능이 수행되도록 지정된 스크립트(명령어 집합)

  • 장점 : 다른 언어보다 빠르게 동작함
  • 단점 : 복잡함, 어려움

shell script 특징

쉘이나 커맨드라인 인터프리터에서 수행하도록 작성되었거나 운영체제를 위해 사용된 스크립트

기능
파일 이용, 프로그램 실행, 문자열 출력


Bash
현재 사용하는 centOs에서 기본적으로 사용하는 기본 쉘은 bash 쉘이다.
bash 특징은 명령어 단축, 사용했던 명령어 다시 불러와서 사용할수있는 history, 연산기능, 작업컨트롤기능, tab사용하여 완성하는 자동 이름 완성 기능, 프롬프트 제어기능, 명령 편집 기능 등이 있다.

  • 장점 : 다른 언어보다 빠르게 동작함
    • 따로 컴파일을 수행하는 단계가 필요없기때문에 더 빠르게 처리할 수 있다.
  • 단점 : 복잡함, 어려움, 에러확인 어려움

셸 출력 명령

//echo

//printf 출력형식을 지정하여 문자열을 출력
printf 옵션 물자열

변수생성
vi 에디터 쉘스크립트
$
echo "사용자명 : " $USERNAME
echo "호스트명 : " $HOSTNAME
export USERNAME=JHJ = 문자열

변수생성시 USERNAME=JHJ 공백이있으면 안된다

[root@localhost sh_test.d]# vi inout.sh
echo "키보드 입력 프로그램"
echo "입력값 :"
read input1
echo "출력값 : $input1"
exit 0

: 결과
키보드 입력 프로그램
입력값 :
{input.value}
출력값 : {input.value}

입력값이 처리 -> 하나의 변수로 인식

숫자계산

셸스크립트는 모든 변수를 문자열로 처리, 키워드 expr을 붙여야한다
연산식은 시작과 끝을 묶어줘야한다. ``백틱으로
\한글모드 |영문모드 곱센연산(*) 앞에도 반드시 \또는 |를 붙여야한다,.

vi cal_test.shc

echo "두 수를 입력받아 곱셈/나눗셈/평균 계산"
echo "첫번째 수 : "
read num1
echo "두번째 수 : "
read num2
echo "-----------"
echo "곱셈 결과 :"
mul=expr $num1 \* $num2
echo $mul
echo "나눗셈 결과 :"
div=expr $num1 / $num2
echo $div
echo "평균결과 :"
avg=expr \( $num1 + $num2 \) / 2
echo $avg

sh cal_test.sh

파라미터
(parameter, 매개변수)

vi parameter.sh

echo "파라미터 테스트"
echo "-----------------------"
echo "첫번째 파일 이름 : <0>:" echo "두번째파라미터 : <$1>" echo "세번째 파라미터 : <$2>" echo "전체 파라미터 : <*>"
echo "-----------------"
exit 0

			0        1    2     3

[root@localhost sh_test.d]# sh parameter.sh 255 168 hungry

파라미터 테스트

첫번째 파일 이름 : <parameter.sh>:
두번째파라미터 : <255>
세번째 파라미터 : <168>

전체 파라미터 : <255 168 hungry>

  • 흐름문(분기문)
  1. 반복문
  2. 조건문

// 기본 조건문 if
if [조건]
then
조건이 참일 경우 실행될 명령어 문장
fi


조건문 실습

vi if_test.sh

if [ "a" != "a" ] ! not
then
echo "조건이 참인 경우 실행되는 문장"
else
echo "조건이 거짓인 경우 실행되는 문장"
fi

sh if_test.sh
조건이 거짓인 경우 실행되는 문장

--비교연산자 -> 옵션--

= -eq
!= -ne

-gt

< -lt
= -ge
<= -le

논리연산도 지정가능(다중연산) -> 조건의 확장
&& ||

--파일을 비교하는 경우--
-d파일명 : 주어진 파일이 디렉토리이면 true
-e파일명 : 주어진 파일이름이 존재하면 true
-f파일명 : 주어진 파일이름이 일반 파일이면 true
-r파일명 : 주어진 파일을 읽을 수 있으면 true
-w파일명 : 주어진 파일을 쓸 수 있으면 true
-x파일명 : 주어진 파일을 실행할 수 있으면 true
-s파일명 : 주어진 파일의 크기가 0이 아니면 true
-u파일명 : 주어진 파일이름이 set-user-id가 설정이 되면 true
-g파일명 : 주어진 파일이름이 set-group-id가 설정이 되면 true

-파일 관련된 조건 셸 프로그래밍-

vi if_file.sh

#! /bin/sh #주석
echo "파일 조건 판별"
echo "-------------------"
echo "파일이름 : [/lib/systemd/system/httpd.service]"
echo "파일조건 : [-f&f_name]
f_name=/lib/systemd/system/httpd.service
if [ -f$_name ]
then
echo "주어진 파일은 일반 파일"
else
echo "주어진 파일은 일반 파일이 아님"
fi
exit 0 exit 0 문제없이 종료

sh if_file.sh
주어진 파일은 일반 파일

ls -l /lib/systemd/system/httpd.service
결과 -rw-r--r--. 1 root root 752 9월 30 2020 /lib/systemd/system/httpd.service
ㄴ - 아무것도 없으므로 일반파일

// 조건문2 //
case ~ esac

case "" in
조건1)
echo
조건2)
echo
(조건3)
echo
*)
echo
esac

조건문2 실습
vi case_season.sh

#! /bin/sh
echo "계절 판별 (Spring/Summer/Fall/Winter)"
case "$1" in
Spring)
echo "봄";;
Summer)
echo "여름";;
*)
echo " 잘못된 값을 입력"
esac

exit 0


// 반복문 //

  1. ver1
    -for ~ in
    for ((초기값;반복조건;증감값))
    do
    조건이 참일 동안 수행되는 명령
    done

  1. ver2
    for 변수 in seq 초기값 마지막값
    do
    조건이 참일 동안 수행되는 명령
    done

3.ver3
for 변수 in 값1, 값2, ....
do
조건이 참일 동안 수행되는 명령
done

  • 반복문 실습-

vi for_test.sh

#! /bin/sh
echo "for문 1~10까지 누적 결과 출력"
sum = 0
for((num=1;num<=10;num++))
do
sum=expr $sum + $num
echo "1부터 $num까지 중간 합산 결과 : $sum"
done
echo "1부터 10까지 누적된 결과 : $sum"
exit 0

sh for_test.sh
for문 1~10까지 누적 결과 출력
sum: =: 그런 파일이나 디렉터리가 없습니다
sum: 0: 그런 파일이나 디렉터리가 없습니다
1부터 1까지 중간 합산 결과 : 1
1부터 2까지 중간 합산 결과 : 3
1부터 3까지 중간 합산 결과 : 6
1부터 4까지 중간 합산 결과 : 10
1부터 5까지 중간 합산 결과 : 15
1부터 6까지 중간 합산 결과 : 21
1부터 7까지 중간 합산 결과 : 28
1부터 8까지 중간 합산 결과 : 36
1부터 9까지 중간 합산 결과 : 45
1부터 10까지 중간 합산 결과 : 55
1부터 10까지 누적된 결과 : 55

//반복문2//
while
while[조건식]
do
조건이 참일 경우 실행되는 문장
done

for문 반복횟수 정해져있을때, while은 반복횟수가 정해져 있지않을때

반복문2 실습

cp if_test.sh while_test.sh
vi while_test.sh

#! /bin/sh
echo "while문 1~10까지 누적 결과 출력"
sum=0
num=1
while [ $num -le 10 ]
do
sum=expr $sum + $num
echo "1부터 $num까지 중간 합산 결과 : $sum"
num=expr $num + 1
done
echo "1부터 10까지 누적된 결과 : $sum"
exit 0

결과

sh while_test.sh

while문 1~10까지 누적 결과 출력
1부터 1까지 중간 합산 결과 : 1
1부터 2까지 중간 합산 결과 : 3
1부터 3까지 중간 합산 결과 : 6
1부터 4까지 중간 합산 결과 : 10
1부터 5까지 중간 합산 결과 : 15
1부터 6까지 중간 합산 결과 : 21
1부터 7까지 중간 합산 결과 : 28
1부터 8까지 중간 합산 결과 : 36
1부터 9까지 중간 합산 결과 : 45
1부터 10까지 중간 합산 결과 : 55
1부터 10까지 누적된 결과 : 55

강사님 결과

case , while 을 이용한 1번예제

#! /bin/sh

echo "혈액형 구분 프로그램"

echo "혈액형을 입력하시오 : "
read abo

while [ 1 ]
do

case $abo in
A|a)
echo "A형을 선택 하였습니다"
break;;
B|b)
echo "B형을 선택 하였습니다"
break;;
O|o)
echo "O형을 선택 하였습니다"
break;;
AB|ab)
echo "AB형을 선택 하였습니다"
break;;
*)
echo "다시 입력 하세요 "
read abo

esac

done

exit 0

break 를 쓰셔서 빠져 나와도 되시고 아니면 변수로 구분해 반복문 빠져나오셔도 됩니다.
a 로 무한 반복되시는분들 break 스펠링 확인해주세요

#! /bin/sh
while [ 1 ]
do
echo "혈액형을 입력 해주세요"
read bool
if [ $bool = "A" -o $bool = "a" ]
then
echo "A 형을 선택하셧습니다."
break
elif [ $bool = "B" -o $bool = "b" ]
then
echo "B 형을 선택하셧습니다."
break
elif [ $bool = "O" -o $bool = "o" ]
then
echo "O 형을 선택하셧습니다."
break
elif [ $bool = "AB" -o "ab" -o "Ab" -o "aB" ]
then
echo "AB 형을 선택하셧습니다."
break;
else
echo "잘못입력하셧습니다. 다시 입력해주세요"
fi
done
exit 0

profile
오히려 좋아

0개의 댓글