Linux 실습일지

Linux 실습일지(7) - Bash Script

s-jiun 2023. 2. 1. 19:50
반응형
반응형
실습 과제

 

이번에 실습과제로 돌려본 프로그램은 '메일 전송 프로그램'이다. 리눅스에서는 mail이라는 명령어로 명령창에서 바로 메일을 전송할 수 있다, 쉘 스크립트 프로그래밍을 통해 프로그램을 실행시키고 메일주소를 입력하면 자주 전송하는 메일을 자동으로 전송해주는 프로그램을 만들었다. 가령 사이트에서 회원가입 축하 메세지를 보내는 등 사람들에게 동일한 내용의 메일을 자주 보낸다면 해당 프로그램이 상당히 유용할 것으로 보인다. 프로그램을 생성하는 과정을 다음과 같다.

1. apt update를 하고 mailutils를 설치한다.

2. 설치가 완료되면 아래와 같은 화면을 확인할 수 있다.

여기서 Internet Site를 선택하고 나머지 사항들은 기본 설정으로 유지해주면 된다.

3. 다음으로 vi에디터로 sendEmail.sh 파일을 생성한다.

4. 그리고 해당 프로그램을 실행시킴 후 메일 주소를 입력하면 메일이 전송된 것을 확인할 수 있다.

 

 

새로 배운 내용

 

이번에는 bash 쉘의 쉘스크립트 언어의 기본적인 문법에 대해 배우고 이를 통해 간단한 프로그램들을 작성해보았다. 그리고 cron과 at 명령어를 통해 시스템 작업을 자동화하는 실습을 진행하였다. 리눅스의 쉘이는 여러 종류가 있는데, 그 중 bash 쉘에 대해 학습한 것으로, bash는 명령 단축 기능, History 기능, 연산 기능, Job Control 기능, 자동 이름 완성 기능, 프롬프트 제어 기능, 명령 편집 기능을 가진다. 또한 쉘에는 여러 환경 변수들이 존재하는데, 이들을 호출하여 사용할 때에는 앞에 $ 표시를 붙여준다. 이는 쉘 스크립트 언어에서 변수를 호출할 때에도 동일하게 적용된다.

우선 쉘 스크립트 언어의 기본적인 문법과 그에 대한 예제는 다음과 같다.

1. 문자열 출력하기

echo: 출력 명령어

2. 환경변수 출력하기

3. 데이터 입력 받아서 출력하기

read: 데이터를 읽어들이는 명령어

변수 var을 선언할 때, 변수와 '='와 대입 값 사이에는 띄어쓰기가 들어가지 않는다!

4. parameter 출력하기

이때 $1은 프로그램 실행 후 입력받은 데이터 중 첫 번째 데이터를 의미한다.

5. 산술 연산 수행하기

이때 함수는 ` `로 감싸주어야 한다.

6. if 조건문으로 파일의 존재 여부 확인하기

이때 -e는 파일이 존재하면 참을 반환하는 것을 의미한다.

7. if - else 조건문으로 파일의 존재 여부 확인하기

8. if - elif 조건문으로 문자열에 데이터가 들어있는지 확인하기

이때 -z는 문자열이 NULL이면 참을 반환하고 -n은 문자열이 NULL이 아니면 참을 반환한다.

9. case 문으로 입력받은 문자열이 yes인지, no인지 판별하기

이때 *는 모든 문자열을 의미한다.

10. if - else 조건문으로 파일에 데이터가 존재하면 상위 5줄을 출력하고, 그렇지 않을 경우 다른 문자열 출력하기

이때 -f는 파일이 일반 파일이면 참을 반환하고, -s는 파일의 크기가 0이 아니면 참을 반환한다.

11. for 반복문을 사용하여 .sh로 끝나는 파일들의 하위 3줄을 출력하기

done: 반복문 종료 명령어

이때 리눅스 명령을 결과로 사용하기 위해 $(command) 형식을 사용하였다.

12. while 반복문을 사용하여 비밀번호를 입력받아 비밀번호가 1234이면 문자열 출력 후 벗어나기

13. 사용자 정의 함수를 이용하여 문자열 출력하기

14. 사용자 정의 함수를 이용하여 문자열 출력하기

local: 지역 변수 선언 명령어

이때 지역변수로 선언된 myresult는 출력되지 못한다.

이 외에도 문자열을 명령어로 인식하고 실행하는 eval 명령어, 외부 변수를 선언하는 export 명령어, 결과를 parameter로 사용하는 set 명령어, parameter 변수를 왼쪽으로 한 단계씩 아래로 이동시키는 shift 명령어 등도 존재한다.

또한 셀 프로그래밍 디버깅 명령어로는 아래 세 가지가 존재한다.

1) sh -n script.sh : 문법 에러 검사

2) sh -v script.sh : 명령어 실행 전에 출력

3) sh -x script.sh : 명령어와 결과를 출력

다음으로 사용자 계정을 여러개 생성하는 쉘 스크립트를 작성해보았다.

실행 결과는 아래와 같으며, 맨 아래에 u01, u02 사용자가 추가된 것을 확인할 수 있다.

마지막으로 cron과 at을 사용하여 작업 예약을 해보았다. cron의 경우 주기적으로 반복되는 작업을 자동화하는 데 사용되는 서비스로, /etc/crontab에 작업을 작성해 놓으면 된다. at의 경우 일회성으로 작업을 예약할 때 사용하는 명령어이다. 더불어 date 명령어도 학습했는데, 이는 현재 시각을 보여주는 것으로 원래 현재 시각은 자동으로 동기화되지만 timedatectl set-ntp 0을 실행하면 동기화가 해제되어 사용자가 장치의 시간을 변경할 수 있다. 다시 동기화가 이루어지도록 하려면 명령창에 timedatectl set-ntp 1을 입력하면 된다.

 

 

문제가 발생하거나 고민한 내용 + 해결과정

 

이번 실습에서는 cron을 사용하여 backup 파일을 생성하는 데 어려움을 겪었다. 분명 쉘 스크립트도 정확하게 작성했고 Backup 디렉토리도 생성했는데 아무리 시간이 지나도 백업 파일이 생성되지 않아 이를 해결하는 데 어려움이 있었다. 강의자료를 다시 한 번 읽어보니 그 원인을 알 수 있었는데, 내가 쉘 스크립트를 작성하고는 이를 실행할 수 있도록 속성을 변경하지 않았던 것이다. 그래서 chmod명령어로 +x를 통해 실행 권한을 추가해주었더니 비로소 백업 파일이 정상적으로 생성되기 시작하였다.

두번째로 어려움을 겪었던 부분은 바로 실습 과제를 진행하면서 셍겼는데, sendEmail을 작성하고 나서 메일을 나의 메일 주소로 보내 보았는데 메일이 온 것이 계속 확인되지 않아 애를 먹었다. 인터넷으로 원인을 찾아본 결과, 리눅스 서버로 보낸 메일이 스팸 메일함으로 보내졌다는 것을 알 수 있었다. 아무래도 정식 인터넷 사이트가 아닌 곳에서 메일을 보내다보니 발생한 문제인 것 같다.

 

참고할 만한 내용

 

아래 사이트는 내가 쉘 스크립트로 생성할 프로그램을 찾다가 발견한 사이트이다. Bash 스크립트로 해볼 수 있는 30가지의 예제가 정리되어 있어 쉘 스크립트 연습할 때 좋을 것 같다. 이 외에도 Bash programming에 대한 다양한 정보를 얻을 수 있는 곳이니 종종 참고해보아도 좋을 듯하다.

https://linuxhint.com/30_bash_script_examples

 

30 Bash Script Examples

I am a trainer of web programming courses. I like to write article or tutorial on various IT topics. I have a YouTube channel where many types of tutorials based on Ubuntu, Windows, Word, Excel, WordPress, Magento, Laravel etc. are published: Tutorials4u H

linuxhint.com

 

 

회고

 

이번 수업은 리눅스 실습이기는 하지만 뭔가 프로그래밍 실습을 하는 느낌이었다. 쉘 스크립트 언어를 직접 실습해보니 내가 기존에 알고있던 C언어와 비슷한 구석이 많나는 느낌을 받을 수 있었다. (대표적으로 조건문, 반복문에서 그러한 느낌을 많이 받았다) 하지만 여전히 기존에 알고 있던 프로그래밍 언어와 괴리감은 있어서 익숙해지려면 많은 연습이 필요할 듯하다. 그리고 쉘 스크립트의 경우 리눅스 명령어를 스크립트에 포함하여 작성할 수 있다는 점이 흥미로웠다. 요즘 C++, JAVA, C언어를 동시에 연습하고 있어 쉘 스크립트 언어까지 배우니 언어가 머릿속에서 막 섞이는 듯한데, 많이 연습하다보면 이것도 차근차근 정리가 되지 않을까 생각한다.

반응형