[리눅스] - shell 프로그래밍

2024. 9. 5. 17:50현대 오토에버 SW 스쿨 - 클라우드/리눅스

SMALL
>> 리눅스의 쉘 스크립트는 C 언어와 유사한 방법으로 프로그래밍 할 수 있습니다. 
>> 쉘 스크립트 파일의 확장자는 sh 로 합니다. 
>> 최상단에는 #!/bin/sh 를 추가합니다. 
>> 셔뱅이라고는 bash 쉘을 사용하겠는 의미이며 #으로 시작하면 주석이지만 #!는 주석이 아닙니다. 

파일 실행 방법

  • sh 스크립트 파일 경로 :: 읽기 권한만 있다면 수행됩니다.
  • 스크립트 파일의 경로 - 현재 디렉터리에 있는 경우 ./를 추가해서 경로를 작성합니다. 실행권한이 있어야 실행가능합니다. 
  • 경로 입력시 실행 x 1. ./를 추가하지 않은 경우 2. 실행 권한이 없는 경우
  • cron 생성 시 스크립트로 생성 후 실행시키는 것이 좋습니다. 파일을 저장하고 실행하는 것이 안전합니다. 

변수

  • 이름에 값을 보관하기 위한 것으로 shell programming 에서는 변수에 넣는 값은 모두 문자열로 취급
  • 변수 이름은 대소문자를 구분하며 데이터를 대입할 때 = 를 이용하는데 좌우에 공백이 없어야 합니다. 
  • 값에 공백이 있는 경우 ""(큰따옴표)로 묶어 주어야합니다. 
  • $(달러) 가 들어간 내용을 출력할 때는 "'(큰따옴표)로 묶어주거나 ₩(원)를 붙여서 출력을 해야합니다. 
  • echo $변수이름 : 출력
변수 생성 후 출력

계산식 사용 

  • 계산식을 사용하고자 하는 경우 ₩(백틱) 안에 expr 로 시작해서 작성하면 됩니다. 
  • 수식에 ()(괄호)를 사용하는 경우 / *(곱하기) 를 사용할 때에는 ₩ 를 붙여야 합니다. 

파라미터 설정

  • 실행을 할 때 명령과 같이 넘겨주는 데이터로 데이터가 없으면 명령이나 프로그램은 고정적인 일만 가능합니다. 
  • 파라미터를 사용할 때는 $파라미터위치 형태로 작성하면 되고 위치는 0 부터 시작합니다. 
  • sh 스크립트 파일 이름이 a b c d 인 경우 -> echo "$0" -> a; echo "$2" -> c
  • 명령어 :: shell 내장 명령 (shell 에 따라 다를 수 있음)+ 실행파일 경로
  • -옵션도 파라미터 // shell 프로그래밍 :: 명령어부터 파라미터로 인식 // $0 = 자신의 파일명?
  • 외부 -> 함수 :: 파라미터 // 함수 내에서 실행 :: argument 
  • 기본적으로 파일은 실행 권한이 없이 생성됩니다. -> 일반적으로 바이너리 파일은 모두가 사용할 수 있게 설정 ls
  • chmod 로 실행 권한 부여 -> ./파일이름 으로 실행 가능 // PATH 에 추가하는 방법도 있음 (export PATH=$PATH:디렉터리 이름)
  • 실행 프로그램은 명령이 들어오면 PATH 에 가서 찾음
vi param.sh						-- vi 편집기 

-- vi 편집기 내부에 프로그램 작성
#! /bin/sh						
echo "first-parameter <$0>"
echo `expr $1 + $2`
:wq

sh param.sh 1 2						-- 저장 후 나와서 확인 1,2 파라미터 부여
> first-parameter <param.sh>				-- 결과 
> 3

제어문

if

  • 형식 : if [표현식] then 참일 때 수행할 내용 else 거짓일 때 수행할 내용 fi

파일 관련 조건

-d 파일 경로 : 디렉터리면 참
-e 파일 경로 : 존재하면 참
-f 파일 경로 : 일반 파일이면 참
-g 파일 경로 : setGID 가 설정되면 참
-r 파일 경로 : 읽기 가능이면 참
-s 파일 경로 : 크기가 0이 아니면 참
-u 파일 경로 : setUID 가 설정되면 참
-w 파일 경로 : 쓰기 가능이면 참
-x 파일 경로 : 실행 가능이면 참
-- testFile.sh 파일 생성 후 작성
vi testFile.sh

#! /bin/bash
if [ -f /lib/systemd/system/cron.service ]
then 
    echo "file is exist"
else
    echo "file not found"
fi

-- 저장 후 실행
sh testFile.sh
> file is exist

case ~esac

  • 참/거짓이 아닌 값으로 분기합니다. 
  • 형식 : case 데이터 in 값) 값일 때 수행할 내용;; 값) 값일 때 수행할 내용;; *) 나머지 경우에 수행할 내용;; esac
  • 수행할 내용이 여러개가 가능하므로 하나의 수행값 다음으로 ;; 를 추가해줘야 합니다.
  • 여러개의 값에 동일한 내용을 수행하고 하는 경우 값에 | (하이픈) 을 사용하여 작성할 수 있습니다. 
-- case.sh 에 생성
#! /bin/sh
case "$1" in 
       s)
        echo "start";;
        e)
        echo "and";;
        *)
        echo "end";;
esac

and &  or 

  • and - &&, -a 로 대체 가능
  • or - || , -o 로 대체 가능
  • 형식 : if [조건] && [조건] 의 형태로 입력
-- cron.service 파일과 홈 디렉터리에 if.sh 파일이 있다면 성공 아니면 실패라고 출력
#! /bin/sh
if [ -f /lib/systemd/system/cron.service ] && [ -f ~/if.sh ]
    then 
        echo "success"
    else
        echo "fail"
fi

for ~in

  • 형식 : for 임시변수 in 데이터 나열 do 데이터를 임시변수에 하나씩 대입하고 수행할 문장 done
  • in 뒤의 데이터 개수만큼 반복
for i in 1 2 3 4 5
do
        hap=`expr $hap + $i`;
done
echo $hap
  • 현재 디렉터리의 모든 txt 파일을 읽어서 내용을 출력

while

  • 표현식이 거짓이 될 때까지 반복
  • 형식 : while [표현식] do 표현식이 거짓이 아니면 수행할 내용 done

기타

break :: for 나 while 을 강제로 중단하고자 할 때 사용,  case 구문에서 수행할 내용이 없을 때 사용하기도 합니다. 
until :: 반복문
continue :: for 나 while 의 시작 부분으로 이동
exit :: 프로그램을 완전히 종료하는 제어문으로 상위 프로세스에게 넘겨줄 정수를 가팅 사용합니다. 
return :: 함수를 호출한 고승로 돌아가는 제어 명령어

Function

  • 자주 사용하는 구문을 묶어서 하나의 이름으로 사용합니다. 
  • 메모리를 별도로 할당 받아서 사용하여 함수부터는 모듈 프로그램으로 인식합니다. 
  • 함수가 별도의 객체가 되는 경우 함수형 프로그래밍, 함수가 종속되는 경우 객체지향 프로그래밍이라고 합니다. 
  • 모듈 :: 나누어져서 할 수 있는 것을 말함. Function, Instance, File
  • 형식 :: 이름 (매개변수 나열) { 함수 내용 (줄바꿈) return}
  • 호출 :: 함수이름(매개변수) 
#! /bin/sh

myfunc() {
        echo "My Function"
        return
}
myfunc

sh func.sh
>> My Function

 

eval 

  • 문자열을 명령으로 수행
  • 파이썬이나 자바스크립트에서 이함수가 문자열을 데이터로 치환합니다. 
  • 형식 : eval "문자열"
eval 문자열로 명령 수행
반응형
LIST