사용자가 입력한 명령어 커널에게 전달될때 해석기
쉘은 사용자의 응용프로그램과 커널 사이에 위치한 명령어 해석기
쉘(shell)은 명령어를 받아 해석하여 커널(kernel)에게 전송 -> 커널은 명령 동작 수행, 그에 대한 결과를 사용자에게 전달하기휘애 다시 쉘에 응답을 보내고 쉘을 거쳐 사용자에게 도달
Command line에서 특정 기능이 수행되도록 지정된 스크립트(명령어 집합)
쉘이나 커맨드라인 인터프리터에서 수행하도록 작성되었거나 운영체제를 위해 사용된 스크립트
기능
파일 이용, 프로그램 실행, 문자열 출력
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>
// 기본 조건문 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
// 반복문 //
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
결과
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