본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스 유닉스] 셸 스크립트 프로그래밍 시작, 셔뱅, 스크립트 생성하고 실행하기(echo, #!) Linux Unix

반응형

 

 

안녕하세요~!! 주말 다들 잘 보내고 계신가요 ㅎㅎ

리눅스 유닉스 기본 사용법에 대해서 그 동안 포스팅을 했었는데, 슬슬 셸 스크립트 프로그래밍 관련 글도 정리해보려고 해요. ㅎㅎ 저도 리눅스유닉스는 독학으로 배웠고 현재도 계속 나아가는 중이랍니다. ㅎㅎㅎ

사진출처: https://www.radicaltechnologies.co.in/unix-training-in-pune/shell-scripting/

모든 프로그래밍의 시작점이자, 코딩을 한 번쯤 해봤으면 모를 수가 없는 헬로우 월드를 출력하는 거부터 시작해봅시다.

스크립트 생성

C언어든 자바든 코딩을 하려면 파일 생성이 가장 먼저였죠~! 우리가 잘 아는 vi를 이용해서 편집을 해줄겁니다 ㅎ스크립트 파일은 생성할 때 뒤에 .sh 확장자를 붙여줘서 구분할 수 있게 합시다.

(사실 편집은 vi로 하든, gedit으로 하든 어떤 에디터를 사용하던 상관 없지만 포스팅은 가장 많이 사용되는 편집기이기도 한 vi를 사용할거예요~)

~# vi test.sh

참고 링크: 에디터란? / vi편집기 사용법

SHEBANG(셔뱅, 쉬뱅?!)

위키백과는 셔뱅이라 하고 제타위키는 쉬뱅이라하고,, 어차피 영어기 때문에 뭐라 부르든 상관 없습니다.

실제로 들어보면 쉬뱅과 셔뱅의 중간발음이예요 ㅋㅋ 저는 셔뱅이라고 일단 이름을 통칭하겠습니다~

'#!' 요 아이가 셔뱅이예요. 얘는 스크립트 맨 처음에 꼭 써줘야 합니다.

사진출처: https://medium.com/@faizanahemad/debugging-bash-shell-scripts-df52c5428235

'이 스크립트는 bash 셸로 명령어를 해석하겠다~ '라는 것을 명시해주는 라인이예요. 주석인 '#'가 앞에 있어서 주석비스므리하게 보이지만 '해당 인터프리터를 이용해서 해석하겠다'는 인터프리터 지정 명령어(?)입니다. ㅎㅎㅎ

요 아이를 안써줬을 경우, 해당 시스템에 bash가 없는데, 스크립트를 bash로 실행하게 되면 에러가 떠요. 항상 처음에 써주는 습관을 꼭 들여줍시다.

 

간단한 사용 가능한 셸 확인 명령어 잠깐 복습겸 짚고 넘어갈까요?

~# cat /etc/shells

요 아이를 치면 내 시스템에서 사용할 수 있는 셸들을 알려줍니당 

HELLO WORLD 간단한 스크립트 작성

echo는 단순한 출력함수예요. 고냥 화면에 출력해줌. 

#! /bin/bash 
echo "HELLO WORLD" 
exit 0

exit 0은 종료 코드를 0으로 반환해달라는 의미입니다.

근데 이걸 왜하냐면요..

셸 스크립트는 중간에 문제가 생겨도 성공했다는 메세지를 반환하거든요. 왜 다른 코딩에서는 중간에 문제생기면 에러 뜨거나 디버깅이 안되거나 하잖아요?(자바나 C언어 같은 경우!)

근데 셸은 무조건 성공임 ㅎㅎ 그래서 맨 마지막 줄에 이렇게 exit 으로 0으로 반환해줌으로써, 다른 스크립트에서 해당 스크립트를 호출 했을 때 제대로 실행되었는지 확인할 수 있습니다. 참고로 0은 성공을 의미해요.

 

이렇게 작성하고 저장해줍시다.

~# cat test.sh

해당 명령어로 작성이 잘 됐는지 다시 한 번 확인! (너무 간단한 스크립트라 민망;ㅎㅎ 기초 중 기초 편이니까~)

스크립트 실행

스크립트를 실행하는 법에는 크게 3가지가 있습니다.

1. sh test.sh

2. bash test.sh (지정해준 인터프리터로 실행)

3. ./test.sh

 

일단 sh는 초~~기 인터프리터로 모든 유닉스나 리눅스 시스템에 기본적으로 등록되어 있는 인터프리터입니다. 그래서 그냥 앞에 sh를 붙이면 실행이 됩니다. 유닉스 리눅스 기반 모든 OS가 다 지원을 하기 때문 ㅎㅎ

사실 스크립트 내부에서 인터프리터를 지정해주기 때문에 2번처럼 해당 인터프리터로 실행을 시켜주는게 올바른 일입니다. ㅎㅎ또는 3번을 쓰던가~

 

3번째 방식을 사용해도 됩니다. 한 번 명령어를 실행시켜보면

Permission denied가 떴어요! 바로 실행권한이 없기 때문입니다. 목록을 출력해주는 ls 명령어를 이용해서 확인해보니까 실행권한이 없네요 ㅎㅎㅎ 

(ls 명령어 참고링크 / grep 참고링크 )

 

고러므로 실행권한을 추가시켜줍시다. (권한 바꾸는 chmod 참고링크)

~# chmod +x ./test.sh

바로실행~

오 헬로우 월드를 출력해주는 스크립트가 매우 잘 실행되었네요!! 요 방법은 파일의 속성을 실행 가능으로 변경하는 귀차니즘이 따릅니다. ㅎㅎ 하지만 한 번 변경하면 그 다음부터는 변경하지 않아도 쭉 쓸 수 있지요. 비록 귀찮지만 제일 자주 사용되는 방법입니다. 

 

스크립트 내부에서 인터프리터를 지정해주기 때문에 이 방법으로 사용되면, 인터프리터가 꼬일일이 없이 안에 정의된 셔뱅 인터프리터로 해석하게 해주기 때문이죠.

bash스크립트이면 bash test.sh 하면 되지만, bash스크립트가 아닌데 bash test.sh로 실행하게 되면 호환문제가 생길 수도 있으니까요~

 

참고로 아무나 읽고 실행할 수 있게 하는 권한 변경 명령어는 둘 중 하나로 실행하면 됩니다. (소유자는 쓰기도 물론 가능)

chmod 755 test.sh 
chmod go+rx test.sh

보통 755로 습관처럼 변경 많이 하죠 ㅎㅎ

참고~ 실행 전 문법 확인하기

참고로 셸 스크립트를 작성했으면 실행하기 전에 문법을 확인하는 -n옵션을 사용하면 좋습니다.

//오류 없을 경우 
~# sh -n test.sh 
//오류가 있을 경우 
~# sh -n test.sh 
test.sh: line 2: syntax error: 블라블라

이처럼 실행할 때 -n을 넣어주면 셸은 스크립트를 한 줄씩 읽어서 해석하지만 실행하지는 않습니다.

에러가 없을 경우, 아무것도 출력하지 않고 에러가 있을 경우에는 저런 형식으로 표기를 해줍니다 ㅎㅎ

 

매우매우 간단하고 기초스러운

스크립트 생성, 작성, 그리고 실행까지 알아보았습니다 (shabang은 덤!)

다음 포스팅에서 봐요~!! 공감과 댓글, 광고보답은 항상 감사드립니당 ~:)

 

반응형
  • ㅁㄴㅇㄹ 2019.12.03 17:47

    UNIX에서

    1 if ($#argv != 1 ) then # if number of args is not 1
    2 echo2 <error message> # display error message
    3 exit 1
    4 endif

    이렇게 스크립트를 구성했는데요 실행하면 2번 라인부터 구문 오류가 발생하는데 왜 그런지 모르곘어요
    chmod로 퍼미션은 755로 걸어놓았습니다.

    line 2: syntax error near unexpected token `newline'
    line 2: ` echo2 <error message> # display error message'

    오류 메시지입니다.