Linux

Ch.7 셸 프로그래밍

낑깡꺙냥 2024. 4. 18. 09:25

7.1 셸의 기본

셸은 명령어 해석기의 역할을 한다.

 

7.1.1 CentOS의 bash 셸

CentOS에서 기본적으로 사용하는 셸은 bash이다.

bash 셸의 특징은 다음과 같다.

  • Alias 기능(명령어 단축 기능)
  • History 기능
  • 연산 기능
  • Job Control 기능
  • 자동 이름 완성 기능
  • 프롬포트 제어 기능
  • 명령 편집 기능

7.1.2 셸 명령문 처리 방법

셸 명령문은 명령문과 함께 여러가지 옵션이나 인자를 사용할 수 있으며 형식은 다음과 같다.

  • (프롬포트) 명령어 [옵션] [인자]

7.1.3 환경 변수

설정된 환경 변수는 echo $환경변수이름 형식으로 명령을 실행하면 확인할 수 있다.

환경 변수 값을 변경하려면 export 환경변수=값 형식을 실행한다. 그 외의 환경 변수는 printenv 명령을 실행하면 출력된다.

 

7.2 셸 스크립트 프로그래밍 실습

리눅스의 셸 스크립트는 C 언어와 유사한 방법으로 프로그래밍할 수 있다.

셸 스크립트도 일반적인 프로그래밍 언어와 비슷하게 변수, 반복문, 제어문 등을 사용할 수 있다. 또한 별도로 컴파일하지 않고 vi 에디터나 gedit을 이용해 텍스트 파일 형태로 셸에서 바로 실행할 수 있다. (사용자가 작성한 셸 스크립트는 되도록 확장명을 sh로 지정하자)

* #!/bin/sh -> 특별한 형태의 주석(#!)으로 bash를 사용하겠다는 의미이다. 첫 행에 꼭 써줘야 한다.

 

셸 스크립트를 실행하는 방법에는 크게 두 가지가 있다.

  • sh 명령으로 실행
    • sh 스크립트 명령을 실행
  • '실행 가능'속성으로 변경 후 실행
    • 셸 스크립트 파일의 속성을 '실행 가능'으로 변경한 후 ./스크립트파일 명령을 실행

7.2.2 변수

변수의 기본

  • 셸 스크립트에서 변수를 사용하기 전에 미리 선언하지 않으며, 처음 변수에 값이 할당되면 자동으로 변수가 생성된다.
  • 변수에 넣는 모든 값은 문자열로 취급한다. 즉, 숫자를 넣어도 문자로 취급한다.
  • 변수 이름은 대소문자를 구분한다.
  • 변수를 대입할 때 '='좌우에는 공백이 없어야 한다.

변수의 입력과 출력

'$'라는 문자가 들어간 글자를 출력하려면 ' '로 묶어주거나 앞에 '\'를 붙여야 한다. 또한 " "로 변수를 묶어줘도 되며 묶어주지 않아도 된다.

 

숫자 계산

만약 변수에 들어 있는 값에 +, -, *, / 등의 연산을 하려면 expr 키워드를 사용하면 된다. 단 수식과 함께 역따옴표(`)로 묶어줘야 한다. 그리고 수식에 괄호를 사용하려면 그 앞에 역슬래시(\)를 붙여줘야 한다.

 

파라미터 변수

파라미터는 $0, $1, $2 등의 형태를 갖는다. 이는 실행하는 명령의 부분 하나하나를 변수로 지정한다는 의미다.

dnf -y install gftp

$0 -> dnf

$1 -> -y

$2 -> install

$3 -> gftp

 

NOTE

더보기

set -> 로컬 변수 지정

0 1 2 숫자라는 양식
null은 아무것도 없음(missing data)
"" - 공백 자체가 값



연구 과제
다음 조건이 모두 포함된 쉘 스크립트를 작성하고, 해당 스크립트가 매월 수요일 09시 15분에 작동하도록 하시오.

조건 1. 결과값이 1800이 출력되는 변수를 만들되, 해당 변수 출력시 모든 사칙 연산 기호와 괄호를 사용하시오.

조건 2. 현재 시스템의 날짜, 호스트 이름, 현재 사용자, 현재 위치를 출력하시오.
*작업 전 호스트 이름을 http://www.4gl.com으로 변경하시오. (hostnamectl set-hostname http://www.4gl.com실행 후 exec bash로 재시작)

조건 3. xrdp 서비스가 설치되어 있는지 확인하여 참 혹은 거짓을 판단하는 조건문을 작성하고, 만약 참일 경우 "해당 원격 접속 서비스가 실행 중입니다" 라는 조건문을 출력하고, 만약 거짓일 경우 xrdp 서버를 설치한 후 설치가 완료되면 "해당 원격 접속 서비스가 설치되어 있지 않아 설치했습니다." 라는 문구가 출력되도록 하시오.

각 쉘 스크립트는 별개의 파일 3개로 작성하시오.

15 09 * * * root run-parts /etc/cron.weekly > /dev/tty1
#조건1#
#!/bin/bash

num1=800
num2=1000
num3=' \( $num1 + $num2 \) \* 2 / 2 - 0 '
echo $num3

exit 0
#조건2#
#!/bin/bash

echo 날짜 : $(date)
echo 호스트명 : $HOMENAME
echo 사용자 : $USER
echo 현재 위치 : $PWD

exit 0
#조건3#
#!/bin/bash

fname=/usr/lib/systemd/system/xrdp.service

if[ -e fname]
then
	systemstl restsrt xrdp
    echo "해당 원격 접속 서비스가 실행 중입니다"
else
	dnf -yq install epel-release
    dnf -yq install xrdp
    echo "해당 원격 접속 서비스가 설치되어 있지 않아 설치했습니다."
fi

exit 0

 

NOTE

더보기

tty - teletypewriter
-> standard input
-> 표준 입력에 연결된 출력 장치(콘솔)
백그라운드로 실행된 결과를 출력하고 싶다면 > /dev/tty1
장치 이름은 서버마다 다름. tty로 확인

{
#!/bin/bash
echo 날짜 : $(date)
echo 호스트명 : $HOMENAME
echo 시용자 : $USER
echo 현재 위치 : $PWD

exit 0
} > 3.txt

-> sh의 실행 결과를 파일로 저장하고 싶을 때 사용