[리눅스] 셀 스크립트 프로그래밍
셀 스크립트 프로그래밍
학습 순서
셀(shell)이란?
- 운영체제를 둘러싸고 입력받는 명령어를 실행시키는 명령어 해석기다.
- 사용자가 입력한 명령을 해석해 커널에게 전달하고 커널의 처리결과를 사용자에게 전달
- 프로그래밍 언어로서의 특성을 가지고 있다.
- 리눅스의 기본 셀은 Bash(Bourne Again Shell) Shell이다.
셀의 종류
상호 연결성, 명령어 라인 편집, 완료, 재실행을 지원하는데 매우 탁월한 성능을 나타냄
Bourne Shell
- BourneShell, /bin/sh
- korn Shell, /bin/ksh
- Bash, /bin/bash
- Z Shell, /bin/zsh
C Shell
- C Shell, /bin/csh
- TC Shell, /bin/tcsh
본 셀(Bourne Shell)
- 최초의 셀
- 단순하고 처리 소도가 빨라서 많이 사용되었고, 지금도 시스템 관리 작업을 수행하는 많은 셀 스크립트는 본 셀을 기반으로 함
- ls -l /bin/sh로 경로 확인하고
- dpkg-reconfigure dash로 bash로 변경
C 셀(C Shell)
- 본 셀에는 없던 에일리어스나 히스토리 같은 사용자의 편의 기능을 포함
- C언어와 형식이 비슷해 C셀이라 한다
콘 셀(Korn Shell)
- C 셀과 달리 본 셀과의 호환성을 유지하고 히스토리, 에일리어스 기능 등 C 셀의 특징도 모두 제공하면서 처리 속도도 빠르다.
베시 셀(Bash Shell)
- 본 셀을 기반으로 개발된 셀
- 본 셀과의 호환성을 유지하며 C셀, 콘 셀의 편리한 기능도 포함
1. 셀 기본 사용
셀의 활용과 기능
셀의 확인과 변경
- 셀들은 /etc/shells파일에 그 경로가 설정
- 사용자 정보는 /etc/passwd 파일에 저장
- 사용자정보의 마지막 필드에 사용자가 사용하는 셀이 설정
셸의 기능
- 셸은 키보드와 화면을 통해서 사용자와 대화하는 인터페이스 기능을 제공
- 강력한 프로그래밍 언어 기능을 지원
- 사용자의 작업 환경을 사용자의 요구사항에 맞추어 설정할 수 있는 기능 제공
- 개인이나 그룹의 스타일이 반영되는 환경을 조성할 수 있다.
셸의 다양한 기능
- 명령 완성 기능(Tab 키를 누르게 되면, 나머지 부분이 완성되어 생성)
방향키로 히스토리 사용하기
- 지금까지 사용했던 명령어를 보려면 history 명령을 사용
- 위 아래 방향키로 사용
- ~/.(히든파일)bash_history 파일에 저장되어 있다.
- ~/.bashrc(runcomend) 파일의 HISTSIZE 변수로 설정할 수 있다.
etc
- 마우스를 사용한 텍스트 복사
- 와일드 캐릭터 지원 - ?(한 문자), *(임의의 문자)
기본 셀 바꾸기
- chsh [옵션] [사용자명]
- 옵션 : -s shell(지정하는 셀로 로그인셀을 변경_절대경로)
- 옵션 : -l(/etc/shells 파일에 지정된 셀을 출력)
- 사용 예
로그인 셀과 서브 셀
- 로그인 셀 : 사용자가 로그인한 직후 자동 생성되는 셀
- 서브 셀 : 사용자가 직접 실행한 셀
- 서브 셀 종료 명령 : ^d(Ctrl+d), exit
- 서브 셀이 종료되면 이전 셀 환경으로 복귀
- 로그인 셀에서 로그아웃하면 접속 해제
현재 사용중인 셀 확인
- 우선 echo $SHELL 하면 현재 셀 상태를 보여준다.
- cat /etc/passwd (Shift+ \ ) grep user1은 user1의 현재 상태를 보여줌
- chsh -s /bin/sh user1 하면 shell을 변경할 수 있다.
- 이 후 cat /etc/passwd (Shift+ \ ) grep user1하면 변경됨을 확인가능
셀 내장 명령어
셀은 자체적으로 내장 명령을 가지고 있다.
- 내장 명령은 별도의 실행 파일이 없고 셀안에 포함한다
- 일반 명령(실행파일)의 경우 /usr/bin/bc
- 실행 명령은 바이너리 파일이므로 cat으로 확인이 불가능하다
bash 셀의 출력 명령
echo [-n] [문자열]
- 화면에 한 줄의 문자열을 출력한다.
- 옵션 -n은 마지막에 출 바꿈을 하지 않는다.
printf 형식 [인수…]
- 자료를 형식화하여 화면에 출력한다.
- %d(10진 정수), \n(줄바꿈) 등 C 언어의 printf 함수 형식을 지정한다.
특수 문자 사용하기
명령을 입력하면 셀을 먼저 특수 문자가 있는지 확인하고 이를 적절한 형태로 변경한 후 명령을 실행
*(별표 - 에스트리크) : 임의의 문자열을 나타내는 특수문자
?와 [ ] : 하나의 문자를 나타내는데 사용
- ?는 길이가 1인 임의의 한 문자, [ ]는 괄호 안에 포함된 문자 중 하나를 나타냄
~과 - : 물결은 사용자의 홈디렉토리, -는 cd명령으로 디렉토리를 이전하기(직전 작업 디렉토리 표시)
;과 (shift+ \ )(파이프) : 명령과 명령을 연결
- ;은 명령을 왼쪽부터 차례로 실행, (shift+ \ )는 왼쪽 명령의 실행결과를 오른쪽 명령의 입력으로 전달
’ ‘와 “ “ : 문자를 감싸서 문자열로 만들어주고, 문자열 안에 사용된 특수문자의 기능을 없앰
- '’은 모든 특수문자를, ““은 ``, \를 제외한 모든 특수문자를 일반문자로 간주
``(틸트) : 셀은 틸트로 감싸인 문자열을 명령으로 해석해 명령의 실행결과로 전환
- “today is 틸트date틸트”
\ : 백슬래쉬는 특수문자 바로 앞에 사용, 해당 특수문자의 효과를 없애고 일반 문자로 처리
특수문자 >, <, » : 입출력의 방향을 바꾸는 특수문자
- 꺽쇠가 두개면 -append(추가)
입출력 방향 바꾸기
표준 입출력 장치
- 표준 입력 장치: 셸이 정보를 받아들이는 장치 -> 키보드
- 표준 출력 장치: 실행 결과를 내보내는 장치 -> 모니터
- 표준 오류 장치: 오류 메시지를 내보내는 장치 -> 모니터
파일 디스크립터
- 파일 관리를 위해 붙이는 일련 번호
- 표준 입출력 장치를 파일로 바꾸는 것을 ‘리다이렉션(redirection)’ 이라고 함
출력 리디렉션
-
> : 기존 파일의 내용을 삭제하고 새로 결과를 저장
-
>> : 기존 파일의 내용뒤에 결과를 추가
파일 겹쳐쓰기 명령 > 파일이름
- ex. ls -la > out1 으로 파일에 명령어 저장
- set -o noclobber 하고
- ls > out1 하면 이미 있는 파일이라 겹쳐쓰기를 방지해준다.
- 해제하려면 set +o noclobber
cat 명령으로 파일 생성하기
- cat > out1 입력 후 키보드로 데이터 입력하고 ctrl+D하면
- cat out1하면 입력한 데이터가 보인다.
파일에 내용 추가하기 : »
- cat out1 하면 기존 데이터 보임
- date » out1 하면 기존 데이터 밑에 date가 추가된다.
오류 리디렉션
- 표준 오류도 기본적으로 화면에 출력되면 표준 출력처럼 디리렉션 가능
- ls에 out1밖에 없는데 ls /abc라고 치면 오류가 뜬다.
명령어 2>
- 명령 2> 파일이름
- 표준 오류 메시지를 파일에 저장한다.
- ex. ls /abc 2> ls.err 하면
- 에러 표시가 나타나지 않고 ls.err에 에러메시지가 저장된다.
- cat ls.err하면 그런파일이나 디렉토리가 없다고 에러메시지가 뜬다.
Ex. ls . /abc > ls1.out 2> ls1.err 명령어를 해석해보자
- ls1.out은 정상출력, ls1.err은 오류메시지로 저장
오류 메시지 버리기
- ls /abc 2> /dev/null 하면
- /dev/null(장치파일)이라 휴지통에 버리는 것이다.
표준 출력과 표준 오류를 한 파일로 리디렉션
입력
명령어 <
- 명령 0< 파일 이름
- 명령 < 파일 이름
- 표준 입력을 바꾼다.
2. 변수 사용과 에일리어스, 히스토리
셀 변수와 환경변수
셀 변수 : 지역변수 소문자 환경변수 : 전역변수 대문자
전체 변수 출력 : set, env
주요 환경변수
- HISTSIZE : 히스토리 저장 크기
- HOME : 사용자 홈 디렉토리의 절대 경로
- LANG : 사용하는 언어
- LOGNAME : 사용자 계정 이름
- PATH : 명령을 탐색할 경로
- PWD : 작업 디렉토리 절대 경로
- SHELL : 로그인 셀
특정 변수 출력하기 : echo
- 변수의 값을 출력할 때는 변수 이름 앞에 특수 문자 $을 붙임
- ex. echo $SHELL : /bin/bash
셀 변수 설정하기
- 변수이름 = 문자열
- Ex. SOME = test
- echo SOME 하면 SOME
- echo $SOME 하면 test가 출력
환경변수 설정하기 : export
- 지정한 셀 변수를 환경변수로 변경한다.
- export [-n] [셀변수]
- -n은 환경변수를 셀 변수로 바꾼다.
- -n으로 지정하면 env에서 보이지 않는다.
변수 해제하기 : unset
- 지정한 변수를 해제한다.
- unset 변수
먼저 셀 변수를 정의하고, export 명령을 사용해 이를 환경변수로 변경한다.
에일리어스
- 긴 명령 대신 짧은 명령을 만들어 사용가능하다.
- 여러 명령을 연결해 하나의 명령으로 만들 수 이있음
alias
- 에일리어스를 생성한다.
- alias 이름 = 명령
- alias만 치면 현재 설정되어있는 에일리어스가 출력된다.
- 다음은 alias 사용 예시다. 중요!!
에일리어스에 인자 전달하기
- 배시 셀에서는 에일리어스로 인자를 전달할 수 없음
- 배시 셀에서 인자를 전달하려면 프로그래밍 기능에서 함수를 사용
unalias : 에일리어스 해제하기
- alias 명령으로 현재 alias를 확인하고
- unalis 별칭 명령으로 alias를 삭제한다.
히스토리
- 사용자가 이전에 입력한 명령을 다시 불러 사용하는 것
- 명령 : histoty
명령 편집하기와 재실행하기
- 화살표 키로 수정가능
히스토리 저장하기
- 히스토리는 .bash_history에 히스토리 저장한다.
- more ~/.bash_history로 확인가능
3. 사용자 환경 설정
프롬프트 설정
프롬프트 설정 변수 : PS1
- 프롬프트를 바꾸는 것은 환경변수 PS1에 새로운 형태의 문자열을 지정하는 것
이스케이프 문자와 프롬프트 설정하기
- \으로 시작하는 특별한 문자가 이스케이프 문자
- \u와 같이 \으로 시작하는 이스케이프 문자는 두 글자가 아니라 한 글자로 처리
- 이스케이프 문자는 화면에 문자 그대로 출력되지 않고 셸이 문자의 의미를 해석하여 실행
프롬프트 변경 예제
- 우분투 디폴트 프롬프트는 단색이다. 프롬프트를 변경해 원하는 모양의 프롬프트를 설정하기
셀 환경 설정
사용자 환경 설정
- 셸 환경 설정 파일은 기본적으로 사용자의 홈 디렉토리 안에 위치
- 새로운 사용자를 등록하면 /etc/skel디렉토리에 기본값으로 저장되어있는 파일들을 사용자의 기본 홈 디렉토리로 복사하여 생성된다.
환경설정 파일
- 사용자가 로그인 할 때마다 자동으로 실행되는 명령을 저장한 것이 환경설정 파일
- 시스템 환경설정 파일과 사용자 환경설정 파일이 있음
- 셀마다 다른 이름의 파일을 사용
시스템 환경 설정 파일
- 시스템을 사용하는 전체 사용자의 공통 환경을 설정하는 파일
- /etc/profile, /etc/bashrc, /etc/profile/*.sh
사용자 환경 설정 파일
- 각 사용자의 홈 디렉에 숨김파일로 생성
- 사용자가 내용을 수정하고 관리기능
우분투 환경변수 설정
- /etc/environment : 시스템 단계에서 설정하는 파일로 모든 사용자에게 적용되는 환경설정.
- ~/.profile: 각 사용자마다 개별적인 환경설정 스크립트 파일
- /etc/profile이 /etc/profile.d/ 안의 모든 *.sh 스크립트들을 실행 시킨다.
셀의 명령어 처리 방법
우분투 리눅스의 기본 셀은 bash로 배쉬 셀이라 읽으며, 유닉스의 기본 셀인 bourne셀을 기반으로 korn셀과 C셀의 장점을 함쳐 노은 셀이다.
셀 명령문 형식
bash셀 내장 명령어
- 셀 스크립트는 반복되는 일련의 작업을 셀 스크립트로 만들어 사용, 시스템 관리를 자동화 할 수 있다.
셀 환경 변수 및 실습
- echo $HOSTNAME, $HOME, $LANG등 확인가능
4. 셀 스크립트 프로그래밍
셀 스크립트는 셀을 통해 사용자가 원하는 작업을 한번에 실행시키기 위해 작성하는 프로그래밍 언어
- 셀 스크립트는 명령어들이 나열되어있는 파일이다.
- 셀은 시스템의 강력한 CLI라는 점과 스크립트 언어프리터(통역)라는 점에서 차이가 있다.
- 모든 데몬(백스라운드 프로세스)을 실행하기 위한 명령들이 스크립트 파일이다.
셀 스크립트 작성과 실행
작성
- 에디터를 이용해 작성, 저장
실행(sh : shell)
실행권한 부여(주로 위 방법보다 해당 방법을 사용한다)
셀 스크립트 첫 줄에 #! 의미
셀 변수
변수에 값이 처음 할당되면 자동으로 변수가 생성
- 모든 변수가 문자열(string)로 취급(숫자를 넣어도 문자로 취급)
- 변수 명은 대소문자를 구분(예: $abc, $ABC는 다른 변수)
- 변수에 값을 대입할 때 ‘=‘ 좌우 공백이 없어야 한다.
셀 스크립트 프로그램 예제
-
$문자가 들어간 글자를 출력하면 ‘‘로 묶어주거나 \를 붙여준다.
-
"”은 효과없음
-
exit 0 = 셀스크립트는 실행중 문제가 생겨도 무조건 성공을 리턴하기 때문에 마지막 행에 성공인지 실패인지 여부를 판단하므로 0은 성공, 1은 비정상 종료를 표시
-
C언어에서도 exit는 프로그램에서 빠져나올 때 사용되지만 exit(0)은 프로그램의 성공적인 종료를, exit(1)은 프로그램의 비정상 종료를 ㅊ표시한다.
-
셀 스크립트 파일 저장 디렉토리 생성 후 모든 스크립트들은 여기에 작성
Ex.
예제 작성 및 실행
1.수식계산 예제
- 변수에 대입된 값은 모두 문자열 취급
- 변수의 값을 연산(가감승제)하려면 expr을 사용해야 한다.
- (
)
틸트로 묶어주어야 하며, 모든 연산자와 숫자, 변수, 기호 사이에 space가 있어야 한다. - = 사이에 space가 있으면 안되며, 괄호와 연산자 사용 시 그 앞에 \ 사용해야 한다.
- +, –와 달리 ( , *, ) 에는 예외적 으로 앞에 \를 붙여야 한다.
예제 작성 및 실행
2.파라미터 변수 예제
- 파라미터 변수는 $0, $1. $2, $3 … 형태로 구성, 전체 파라미터 $$*로 표시
75p부터 80까지 정리하자
if문과 case문
1.기본 if문
작성
!이미지
실행
!이미지
2.인자를 입력받아서 출력
작성
!이미지
실행
!이미지
3.if ~ else문
조건의 결과가 true, false로 구분(““사이 공백 조심)
작성 및 실행
!이미지
4.조건문 비교 연산자 - 문자열 끼리 비교해 참, 거짓
!이미지half
예제 이미지 84p
5.산술 비교 연산자
!이미지half
6.파일 관련 조건문
!이미지
예제 이미지86p
7.case ~ esac문 - 1
2개 이상 분기할 때(다중 분기)
- 첫 번째 파라미터 변수 $1의 값에 때라서 분기
작성
!이미지
실행
!이미지
7.case ~ esac문 - 2
실행할 문장이 더 없을 때는 반드시 ; ; 입력한다.
- exit 1은 정상적인 종료가 아니므로
- line6 : 다음 실행 라인이 더 있으므로 ;; 하지 않음
- line8 : 앞에 n 또는 N이 있으면 모든 단어를 인정
- line12: 정상적인 종료가 아니므로 exit 1으로 종료
작성
!이미지
실행
!이미지
AND, OR 관계 연산자
and = -a 또는 &&, or = -o 또는 \(파이프기호 두개) -a 나 –o 는 테스트문 안에서 사용될 수 있는데 괄호는 특수문자 앞에는 역슬레쉬()를 붙여줘야 한다.
- If [ ( -f \ $fname ) –a ( -s \ $fname ) ] ; then ( -f = 일반파일, -s = 크기가 0이 아닌 파일
작성
!이미지
실행
!이미지
for 문
1.for문 설명 : for 변수 in 값1 값2 값3 …
do
반복할 문장
done
작성
!이미지
실행
!이미지
2.for문 예제
- 현재 디렉토리 위치에서 *.sh로 끝나는 셀 스크립트 파일들의 파일명과 파일의 내용을 앞에서 3줄씩 화면에 표시하는 스크립트를 작성하세요
작성
!이미지
실행
!이미지
while 문
조건식이 참인 동안 계속 반복
- 조건식에 [1] 또는 [:] 또는 while [true]가 오면 항상 참이다.
- 무한 루프 벗어나기 : Ctrl + C
작성
!이미지
실행
!이미지
또다른 예제
작성
!이미지
실행
!이미지
예제 : 비밀번호를 입력 받고 비밀번호가 맞을 때 까지 계속 비밀번호를 입력받는 스크립트를 작성하세요
작성
!이미지
실행
!이미지
until 문
조건이 참이 될 때까지 반복 - 거짓인 동안 만 반복
- 예제 - 1에서 10까지 합을 구하는 스크립트 until 문으로 작성하세요
작성
!이미지
실행
!이미지
break, continue, exit 문
- break – 조건문 빠져 나갈 때
- continue - 조건식으로 들어갈 때
- exit - 프로그램 완전 종료시 사용
작성
!이미지
실행
!이미지
사용자 정의 함수
사용자가 직접 함수를 작성하고 호출할 수 있다.
함수이름() { //함수정의
내용들 ...
}
함수이름 //함수호출
작성
!이미지
실행
!이미지
예제
작성
!이미지
실행
!이미지
eval 명령
예제 : 문자열을 명령문으로 인식하고 실행한다.
작성
!이미지
실행
!이미지
export 명령
외부변수(전역변수)로 선언하며 다른 프로그램에서도 변수로 사용
- exp1.sh line2~3 : var1, var2 변수출력, var2는 exp2.sh에서 외부변수로 선언
- exp2.sh line 2 : var1에 값을 넣는다. 일반변수로 exp2.sh내에서 만 사용된다.
- 즉, exp1.sh의 var1과는 우연히 변수명이 같을 뿐 다른 변수다.
작성
!이미지
실행
!이미지
print 명령
C언어의 printf문과 유사
- printf “%5.2f \n\n \t %s \n
- %5.2f = 실수로 5자리 소수점 2째 자리 출력, \n = 줄바꿈, \t =Tab, %s = string(문자열) 출력
- 문자열 출력시 “$var2” - 중간에 공백이 있으므로 “ “ 로 묶어줘야한다.
작성
!이미지
실행
!이미지
set 명령과 $(명령어) 중요!
리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 사용해야 한다.
- 결과를 파라미터로 사용하고자 할 때는 set명령어를 같이 사용한다.(일,월,화,수,목,금,토의 순서)
-
-
-
- (수) 11:20:10 $1 $2 $3 $4 $5
-
-
작성
!이미지
실행
!이미지
끝
댓글남기기