[Linux] Shell 프로그래밍

angie·2024년 9월 9일

Shell Programming


개요

  • 리눅스의 쉘 스크립트는 C 언어와 유사한 방법으로 프로그래밍 할 수 있다.
  • 쉘 스크립트 파일의 확장자는 sh로 한다.
  • 최상단에는 #!/bin/sh 를 추가한다. 이 줄은 서뱅이라고 불리며, bash 쉘을 사용하겠다는 의미이다. 일반적으로 #으로 시작하면 주석으로 처리되지만, 서뱅은 주석이 아니며, 스크립트 실행 환경을 설정하는 중요한 명령어이다.

스크립트 파일 실행 방법

  • sh 스크립트파일경로 - 이 경우는 읽기 권한만 있으면 수행된다.
  • 스크립트파일경로 - 현재 디렉토리에 있는 경우 ./를 추가해서 경로를 작성, 실행 권한이 있어야 한다.
  • 스크립트 파일의 경로를 입력했는데 실행되지 않으면 현재 디렉토리의 경우 ./를 추가하지 않았는지 또는 실행 권한이 없는 것이 아닌지 확인해야 한다.

변수

  • 이름에 값을 보관하기 위한 것
  • 특징
    • 기본적으로 변수에 넣는 값은 전부 문자열로 취급
    • 변수 이름은 대소문자 구분
    • 변수에 데이터를 대입할 때 = 를 이용하는데 좌우에 공백이 없어야 한다.
    • 값에 공백이 있는 경우는 ""로 묶어 주어야 한다.
    • $가 들어간 내용을 출력할 때는 "로 묶어주거나 \를 붙여서 출력해야 한다.

계산식 사용

  • 계산식을 사용하고자 하는 경우는 백틱 안에 expr로 시작해서 작성하면 된다.
  • 수식에 괄호를 사용하는 경우 곱하기 인 *을 사용할 때는 \를 붙여야 한다.
  • 곱하기(*)는 특수 문자로 사용되기 때문에, \*로 작성해야 곱셈으로 인식된다.
  • 괄호도 수식에서 사용할 때는 \( \)를 붙여 사용해야 합니다.

파라미터 설정

  • 실행을 할 때 같이 넘겨주는 데이터
  • 파라미터를 사용할 때는 $파라미터위치 형태로 작성하면 된다.
    위치는 0부터 시작한다.
  • 데이터가 없으면 명령이나 프로그램은 고정적인 일만 가능하다.
  • 명령어
    • Shell 내장 명령
      • Shell에 따라 다를 수 있음
    • 실행 파일 경로
sh 스크립트파일이름 a b c d

$ echo "$0" -> a
$ ehco "$2" -> c

제어문

if

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

파일 관련 조건

  • 파일을 읽어야하면 파일이 있는지 없는지 확인해야 한다

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

  • | /lib/systemd/system/cron_service 라는 파일의 존재 여부를 확인해서 존재하면 존재한다고 그렇지 않으면 없다고 메시지를 출력

if [ -e /lib/systemd/system/cron_service ]
then
    echo "파일이 존재합니다."
else
    echo "파일이 존재하지 않습니다."
fi

case~esac문

  • 값으로 분기
case 데이터 in)
        값일 떄 수행할 내용;;)
        값일 떄 수행할 내용;;)
        값일 떄 수행할 내용;;
    *)
     	나머지 경우에 수행할 내용;;
esac
  • case 구문에 각 값 안에서 여러 개의 실행문을 작성할 수 있기 때문에 내용을 작성할 때 마지막에 ;;을 추가해주어야 한다.
  • 여러개의 값에 동일한 내용을 수행하고자 하는 경우는 값 | 값의 형태로 작성하면 된다.

and와 or

  • and : &&, -a
  • or : ||, -o

if [조건] && [조건] 의 형태로 입력

  • | /lib/systemd/system/cron.service 가 있고 홈 디렉토리에 if.sh 파일이 있다면 성공 그렇지 않다면 실패라고 출력
if [-f /lib/systemd/system/cron.service] && [-f ~/if.sh]
then 
	 echo "success"
else
	 echo "fail"
fi

for~in

  • 형식
for 임시변수 in 데이터나열
do 
	데이터를 임시변수에 하나씩 대입하고 수행할 문장
done
  • | 1부터 5까지 합계
for i in 1 2 3 4 5
do 
	hap=`expr $hap + $i`
done
echo $hap
  • | 현재 디렉토리의 모든 txt 파일을 읽어서 내용을 출력
for fname in $(ls *.txt)
do
	cat $fname
done

while

  • 표현식이 거짓이 될 때까지 반복
  • 형식
while [표현식]
do 
	표현식이 거짓이 아니면 수행할 내용
done
  • | 1부터 5까지 합계
hap=0
i=1
while [ $i -le 6 ]
do
	hap=`expr $hap + $i`
    i=`expr $i + 1`
done
echo "Totla: "$hap"

기타 제어문

break, continue, exit, return

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

함수

  • 자주 사용하는 구문을 묶어서 하나의 이름으로 사용하는 것
  • 메모리를 별도로 할당 받아서 사용한다

생성

이름(매개변수 나열){
	함수 내용
    return
}

호출

  • 함수이름(매개변수)
  • 매개변수가 없으면 이름만으로 호출 가능
myfunc0 (){
	echo "My function"
    return
}

myfunc
exit 0 

eval

  • 문자열을 명령으로 수행
  • 파이썬이나 자바스크립트에서는 이 함수가 문자열을 데이터로 치환한다.

eval"ls -l" -> ls -l 명령어가 실행되어 현재 디렉터리의 파일 목록이 출력됩니다.

profile
열심히 달리는 개발자

0개의 댓글