[Centos 7] Shell Programming, shell script (쉘 스크립트)

2022. 11. 24. 01:53리눅스(Linux)

shell이란?

- 참고자료 -

https://taehei43.tistory.com/30

 

Shell & 변수

$What is Shell? - 유닉스에서 대화형 사용자 인터페이스를 말함 - 사용자가 입력하는 명령어를 이해하고, 실행하는 역할 (명령어 해석기) - 운영체계의 바깥 계층에 위치하며, 사용자와 커널의 의사

taehei43.tistory.com

 

What is Shell Script
   - 명령어를 조합하는 방법으로 프로그램을 만들 수 있도록 한다.
   - DOS에서의 Batch 파일 작성과 유사하다

 

$ Shell Script 의 장점
   - 리눅스 명령 및 환경 변수 등을 사용 할 수 있다.
   - Pipe, Redirection, Filter 등
   -  C 프로그램과 유사한 형태의 프로그래밍이 가능하다.
     • 사용자 정의 함수 생성
     • 각종 Loop문 사용

 

$ Shell Script
   - 명령어가 명령 행에서가 아니라 파일 안에서 실행될 때, 이 파일을 쉘 스크립트라 한다.
   - Shell Script는 일반적으로 편집기에서 작성하며, 그 내용은 주석과 명령어로 구성되어 있다.

 

첫번째 행

#!/bin/bash 
   - 스크립트의 첫번째 행은 스크립트를 사용할 때 사용할 Shell 의 이름을 적는다.
   - 기호 #!는 maginc number라 불리며, 커널이 실행 프로그램으로 인식해야 하는지 
   여부를 알려주기 위해 사용한다.

주석
   - 주석은 파운드 기호(#)가 앞서 나오는 행을 말한다.
   - 적절한 주석을 사용하여야 스크립트가 어떻게 작동하는지 추후에도 알 수 있다.

 

실행문과 Bash shell의 구조
   - Bash shell 프로그램은 유닉스 명령어, Bourne shell 명령어, 프로그램 구조, 주석 등으로 이루어져 있다.

 

스크립트에 실행 권한 부여
   - 스크립트를 실행하려면 적절한 실행 권한을 주어야 한다.

 

$ Linux Bash ShellScript 제어문 연산자

조건 설명
-d “디렉터리명” 디렉터리가 존재 할 경우 참
-e “파일명”  파일이 존재 할 경우 참
-f “파일명” 일반 파일 일 경우 참
-s “파일명”         파일의 크기가 0이 아니면 참
-r “파일명”             읽기 권한이 있는 파일이면 참
-w “파일명”            쓰기 권한이 있는 파일이면 참
-x “파일명”             실행 권한이 있는 파일이면 참
-u “파일명”             Set-UID 특수권한이 설정이 되어있을 경우 참
-z “변수명”             지정 한 변수가 없는 경우를 의미 ( ! )와 유사
비교 연산  설명
[ $a –eq $b ] a                  변수와 b변수는 같다 ( Equal )
[ $a –ne $b ] a                  변수와 b변수는 같지 않다 ( Negation )
[ $a –gt $b ] a                   변수가 b변수보다 크다 ( Greater then )
[ $a –lt $b ] a                    변수가 b변수보다 작다 ( Less then )
[ $a –ge $b ] a                  변수가 b변수보다 크거나 같다 ( Greater Equal )
[ $a –le $b ] a                   변수가 b변수보다 작거나 같다 ( Less Equal )
[ $string1 == $string2 ]        String1이 String2와 같다
[ $string1 != $string2 ]        String1이 String2와 다르다
논리 연산  설명
[ $A && $B ]  A와 B가 모두 참이어야 참 ( AND )
[ $A || $B ]  A와 B둘 중 하나만 참이어도 참 ( OR )
기타 제어문  설명
break  특정 실행 Loop에서 벗어나고자 할 때 사용
continue  특정 실행 Loop에서 조건식으로 이동하고자 할 때 사용
exit  스크립트 종료시 사용
return  함수를 호출한 곳으로 되돌아 가고자 할 때 사용

 

$ 스크립트 내용 및 실행 예제

#! /bin/bash 
# 이 프로그램의 Bash Shell Program의 첫 번째 예제 입니다. 
# 스크립트의 이름 : test 
# 작성자 : 김진홍 (firefox@xcurelab.com) 
echo "안녕하세요 $LOGNAME 님 오늘하루도 좋은 시간 보내세요." 
echo "당신의 현재 작업 디렉토리는` `pwd`` 입니다." 
echo "당신이 작업하고 있는 컴퓨터의 이름은 `uname -n` 입니다." 
echo -e "다음은 현재 당신의 작업 디렉토리에 있는 파일의 목록입니다." \\n 
ls # 현재 위치의 파일 목록 출력 
echo "$LOGNAME 님 안녕히 가세요. 현재시간은 `date +%T`! 입니다." 

# . test.sh 
안녕하세요 root 님 오늘하루도 좋은 시간 보내세요. 
당신의 현재 작업 디렉토리는 /root 입니다. 
당신이 작업하고 있는 컴퓨터의 이름은 localhost.localdomain 입니다. 
다음은 현재 당신의 작업 디렉토리에 있는 파일의 목록입니다. 
 
Desktop anaconda-ks.cfg install.log install.log.syslog ks.cfg 
test.sh 
root 님 안녕히 가세요. 현재시간은 16:19:09! 입니다.

사용자 입력 읽기

$ read 명령어

# read ; echo -e 입력값 테스트 : \\n:$REPLY
test
입력값 테스트 : 
test
   - read 명령어는 개행문자가 나타날 때까지 행을 읽어 들인다.
   - 입력 받은 내용을 저장한 특별한 이름을 지정하지 않으면, REPLY라는 
   특수 내장변수에 값을 저장한다
   
# read test ; echo 특정 변수에 입력 받기 입력값은 $test
read 문 연습
특정 변수에 입력 받기 입력값은 read 문 연습
   - read 명령어를 이용하여 test 라는 변수에 값 입력하기

$ if ~ else문

   - 조건을 표현하기 위한 가장 간단한 형태

if [ 조건 1 ]; then
   "조건 1이 참일 경우 실행 할 내용"
elif [ 조건 2 ]; then
   "조건 2가 참일 경우 실행 할 내용"
else
   "모든 조건이 거짓일 경우 실행 할 내용"
fi
   - " [ " 앞 뒤로 반드시 공백이 존재해야 된다. 
   - if 다음에 나오는 배시의 내장 명령어나 유니스 유틸리티들은 실행되고 
   나서 종료 상태값을 반환한다.
   - 종료 상태값이 0이면 명령어가 성공적으로 수행되었음을 의미
   
if grep "$name" /etc/passwd > /dev/null 2>&1
then
 echo Found $name!
fi

name=test
if grep "$name" /etc/passwd 2>&1
then
echo Found $name !!
fi

$ 숫자 계산

   - Shell Script에서 숫자의 계산은 expr을 사용한다.

#! /bin/bash 
num=`expr 2 + 10 - 4` 
echo $num 
   - expr 숫자 연산

$ case 문

case 조건 in
	조건 1 ) 
		“조건 1이 참일 경우 실행 할 실행문”;;
	조건 2 ) 
		“조건 2가 참일 경우 실행 할 실행문”;;
	* ) 
		“조건 1, 조건 2가 참이 아닐 경우 실행 할 실행문”;;
esac
   - 실행문의 끝지점에는 반드시 “;;“(세미콜론) 2개를 명시한다.

 

$ select 문

select 변수 in [ 항목1 항목2 항목3 .. ]
do 
	“항목이 유효 할 경우 실행 할 실행문”
done
   - select 제어문의 경우 메뉴 구성 시 주로 사용된다.

 

$ for 문

   - 조건 반복문으로 일반적인 다른 프로그래밍 언어의 형태와는 약간 다르다.

for 변수 in 인자1, 인자2, 인자3 … [ 방법.1 ]
for (( 초기값;종료값;증감값 )) [ 방법.2 ] ( ★ )
do 
	“반복하며 실행 할 실행문”
done
   - 일반 C언어 형식을 사용 할 경우 반드시 괄호가 2개 들어가야하며, 앞뒤 공백이 들어가야 한다.

$ while 문

   - for문과 마찬가지로 조건문이 참임 경우에는 반복하여 실행한다.

while [ 조건 ]
do 
	“조건이 만족하는 동안 반복하며 실행 할 실행문”
done
   - if 와 for문을 합쳐놓은 형태
   
echo -n "숫자를 입력하세요 : "
read _num
while [ $_num -gt 5 ]
do
echo "입력하신 숫자가 5보다 큽니다."
done
   - 입력값이 지정된 값보다 크거나 같은경우 무한루프 시키기

$ until 문

   - while 문과 같은 반복문이지만 반대로 동작한다.

   - 주어진 조건이 참이될 때 까지만 반복

until [ 조건문 ]
do
	“조건이 만족할 때 까지만 반복하여 실행 할 실행문”
done
   - until문의 형식

until [ 1 ]
do
	echo "Hackers College Education"
done
   - 참인 조건

$ functon

function 함수명( ) {
	“함수 내부에서 실행 할 실행문”
}
함수명 # 함수 호출
   - 함수 정의 후 해당 함수를 실행하기 위해서는 반드시 호출작업이 진행되어야 한다.
   - 원하는 시점에 원하는 함수가 실행 되어야 한다.

$ ETC

1. [ eval ]
   - 특정 명령어를 변수로 저장하고 원하는 시점에 실행 될 때 사용 된다.
   - EX) str=“ls -l /home”
            eval $str

 

2. [ set, unset ]
   - 특정 변수 할당 및 할당 해제시 주로 사용된다.
   - 에러 발생 시 ShellScript를 즉시 종료하는 용도로 주로 사용 ( set -e )

 

3. [ $(명령어) ]
   - 특정 명령어를 즉시 실행 할 때 주로 사용된다.

 

[root@Linux-01 shell]# PS1="[\u@\h][\T][\W]\$"
[root@Linux-01][10:30:06][shell]$


[root@Linux-01 shell]# echo $PS1
[\u@\h \W]\$
   - PS1 디폴트 값 확인
   
[root@Linux-01 shell]# SAVE=$PS1 
   - SAVE 변수에 PS1 백업
   
[root@Linux-01 shell]# echo $SAVE 
[\u@\h \W]\$
   - SAVE 변수값 확인
   
[root@Linux-01 shell]# PS1="[\u@\h][\T][\W]\$" 
   - PS1 형식 변경
   
[root@Linux-01][10:30:06][shell]$PS1=$SAVE
   - 백업해뒀던 SAVE 불러와서 초기상태로 되돌림
# vi ./cale.sh
#!/bin/bash
echo -n "Num1 Input: "
read num1 
   - 줄바꿈 안하는 옵션(-n), “Num1 Input: ”출력
   - sacnf 랑 같음, num1 변수 선언

echo -n "Num2 Input: "
read num2

echo "Sum: `expr $num1 + $num2`"
echo "Sub: `expr $num1 - $num2`"
echo "Mul: `expr $num1 \* $num2`" → * 이거만쓰면 명령문을 인식안함
echo "Div: `expr $num1 / $num2`"
echo "Mod: `expr $num1 % $num2`"
echo "Ret: `expr \( $num1 + $num2 \) / $num1`" 
   - 형식 잘 지켜야함

# chmod +x ./cale.sh
   - 스크립트 실행권한 부여
# ./cale.sh
   - 스크립트 실행
# vi ./arg.sh
#!/bin/bash
readonly text="Hello Shell Scripts"
echo $text
echo -n "input name, age, addr: "
read name age addr
printf "%s\n" "$name"
printf "%s\n" "$age"
printf "%s\n" "$addr"

echo "실행 중인 스크립트의 파일명: [$0]"
echo "첫 번째 인차값: $1"
echo "두 번째 인차값: $2"
echo "세 번째 인차값: $3"
echo "모든 번째 인차값: $*"

# chmod +x ./arg.sh
# ./arg.sh
# ./arg.sh A B C 
   - 인자값 입력 후 실행
# vi ./arr.sh
#!/bin/bash

arr1=("s1" "22" "Seoul")
   - 배열을 묶을 때 ()를 사용해야한다.
   - 구분자는 띄어쓰기로 한다, 다른구분자는 사용하지 않는다

arr2[0]="s2"
arr2[1]="30"
   - 데이터의 순서 번호(인덱스 번호)를 넣어줘야 한다.

echo ${#arr1[@]} 
echo ${#arr2[@]}
   - 배열 갯수 출력
   - 배열을 지정할때는 ${}를 사용
   - [@] : arr group @는 배열 그룹을 의미, 전체 데이터를 선택하는 행위

printf "%s\n" "${arr1[@]}"
   - arr1 전체 데이터를 출력

echo ${arr2[0]}
echo ${arr2[1]}

# chmod +x ./arr.sh
# vi ./arr.sh
# ./arr.sh