쉘 스크립트 - 1
-
학습 개요
쉘은 명령어 해석기 이며 스크립트 언어이다.
일련의 쉘 명령이나 함수의 조합을 프로그램의 제어 구조를 사용하여 쉘 스크립트 파일로 작성해 두면 편리하게 사용할 때가 있다.
쉘 스크립트의 기본 작성법을 알아보고 변수와 함수의 사용법과 예제를 보자. -
학습 목표
- 쉘 스크립트 파일의 실행 방법을 알 수 있다.
- 쉘 스크립트에서 변수를 사용할 수 있다.
- 쉘 스크립트에서 함수를 정의하고 호출하여 사용할 수 있다.
쉘 스크립트 개요
쉘 스크립트
- 쉘 명령어의 집합으로 이루어진 실행 가능한 텍스트 파일.
- 쉘이 파일의 내용을 읽어 처리함.
- 선택 / 반복 등의 프로그래밍 구조를 사용할 수 있음.
- 긴 작업, 반복적으로 일어나는 작업을 쉘 스크립트로 작성할 수 있음.
- 쉘 스크립트를 새로운 명령어처럼 사용할 수 있음.
- 예)
- ~/.bash_profile, ~/.bachrc 등의 쉘 초기화 스크립트.
- 디렉토리 /etc/rc.d/init.d/에 존재하는 시스템 초기화 스크립트.
- 3차 USE_SHELL을 복습 할 것.
쉘 스크립트의 실행 방법
- bash script_file
- 스크립트 파일에 실행 권한을 추가할 필요가 없음.
- 명령 행에서 script_file 다음에 인수를 추가할 수 있음.
- 서브 쉘을 새로 생성하여 스크립트를 실행함.
- ./script_file
- 스크립트 파일에 실행 권한을 추가 해야 함.
- PATH 환경 변수에 설정된 디렉토리에서 스크립트 파일을 찾음.
- 스크립트 파일의 첫 행에서 #! 다음에 해석기(/bin/bash)를 지정함.
- 서브 쉘을 새로 생성하여 스크립트를 실행함.
- source script_file || / . script_file
- source는 쉘 내장 명령이며 현재 쉘에서 스크립트 파일을 실행함.
쉘 스크립트 문법
- #으로 시작하는 단어와 행은 주석으로 처리 됨.
- $0은 스크립트 파일의 이름으로 확장됨.
- source 명령으로 실행하는 경우 쉘의 이름(bash)으로 확장 됨.
- $1은 첫 번째 인수, $2는 두 번째 인수로 확장 됨
- 스크립트가 복잡하다면 적절한 echo 명령을 넣는 것이 좋음.
- 변수=값을 사용하여 변수에 값을 지정하고 $변수를 사용하여 값을 추출할 수 있음
- 등호(=)의 좌우에 공백이 있으면 안됨
- bash -x script_file과 같이 실행하면 수행되는 명령을 확인할 수 있음.(디버깅 모드)
변수의 사용
쉘스크립트에서 변수의 사용
- 선언 없이 변수를 사용할 수 있음
- MYCOLOR=blue || echo $PATH
- 변수의 값은 기본적으로 문자열로 취급
- 연산이 필요하고, 변환이 가능한 경우에 정수로 다루어짐
- 변수 이름의 작명
- 대소문자 구분
- 영문자, 숫자, 언더스코어로 구성
- 첫 자는 숫자가 될 수 없음.
변수 사용의 예
ex | desc |
---|---|
a=ls | 변수 a에 문자열 'ls'를 대입 |
b="A string" | 따옴표를 사용하여 공백을 가진 문자열을 대입 |
c="A string and $b" | $b를 '변수 확장'한 후 문자열을 대입 |
d=$(ls | wc -l) |
e=$[5*7] | $[...]는 '수식 확장'을 의미. 대괄호 안의 수식을 계산한 후 결과를 대입 |
f="\t\tA string\n" | 이스케이프 문자 \를 사용 |
g=5 h="A String" | 한 행에 2개의 변수를 사용하는 예 |
i=${b}1 | 변수 이름을 중괄호로 묶으면 뒤따라 나오는 문자를 분리할 수 있음. "A string1"이 대입됨. 실제 $b는 ${b}를 줄여 쓴 형태 |
$a | 먼저 변수 확장이 일어나고, 쉘은 이것을 하나의 명령어로 해석하여 처리 |
$a=$e | 변수 확장의 결과는 ls=35. 쉘은 이 자체를 하나의 명령어로 처리하므로 오류가 발생. eval "$a=$e"를 실행할 수 있음 |
명령 행 인수
- 쉘이 스크립트를 처리할 때 사용되는 인수
- 사용자가 스크립트 실행에 필요한 입력값을 주어야 함
- $0은 스크팁트 파일의 이름으로 확장
- 나머지를 위치 매개변수(positional parameteer)라 하며 $1, $2, $3 등은 이러한 인수를 의미함
[ec2-user@ip-aws ~]$ cat > arg.sh
echo "This script's name is $0"
echo Argument 1 : $1
echo Argument 2 : $2
^C
[ec2-user@ip-aws ~]$ ls
arg.sh first.sh list.bak
[ec2-user@ip-aws ~]$ chmod u+x arg.sh
[ec2-user@ip-aws ~]$ ./arg.sh first second
This script's name is ./arg.sh
Argument 1 : first
Argument 2 : second
[ec2-user@ip-aws ~]$ /home/ec2-user/arg.sh one two
This script's name is /home/ec2-user/arg.sh
Argument 1 : one
Argument 2 : two
특별한 매개변수
- 명령 행 인수와 관계가 있는 특별한 변수
- 변수의 값을 참조만 할 수 있음
ex | desc |
---|---|
$* | "$*"는 $0을 제외한 모든 위치 매개변수를 포함하는 1 개의 큰 따옴표 like "$1 $2 $3 ..." |
$@ | 여러 개별 큰 따옴표 문리된 문자열로 확장 됨. "$1", "$2", "$3", ... |
$$ | 쉘의 프로세스 ID PID로 확장 |
$# | 위치 매개변수의 개수로 확장 |
$? | 최근에 실행된 포어그라운드 명령의 종료 상탯값으로 확장됨. 성공적 종료는 0. |
$! | 최근 실행된 백그라운드 명령의 프로세스 ID로 확장됨. |
read
- 키보드로 부터 한 라인을 읽은 후, 단어를 상응하는 변수에 저장함.
- 대화식으로 스크립트를 실행시킬 수 있음.
- read [options] [variable...]
- 첫 번째 변수에 첫 번째 단어를, 두 번째 변수에 두 번째 단어를 저장.
- 마지막 면수에 나머지 모두를 저장.
- 남아있는 변수가 있으면 빈 문자열이 됨.
- 변수의 이름을 사용하지 않으면 쉘 면수 REPLY에 저장됨.
- 옵션
-p prompt
는 입력을 위한 프롬프트를 지정함.
함수의 사용
함수
- 함수는 쉘 스크립트에서 반복적으로 사용되는 명령의 묶음.
- 쉘 스크립트 파일에 함수를 정의할 수 있음.
- 정의되어 있는 함수를 호출하여 사용함.
함수의 호출 방법
- 함수가 정의된 스크립트 파일에서 함수를 호출하여 사용할 수 있음.
- 함수가 정의된 스크립트 파일을 실행하면 쉘 환경에 함수 정의가 추가됨.
-> 같은 쉘에서 함수 이름을 쉘 명령어처럼 사용.- source 명령이나 도트(.) 명령으로 쉘 스크립트를 실행하면 함수 정의가 현재 쉘 환경에 추가됨.
- set 명령으로 확인하고 unset name으로 삭제할 수 있음.
- 이후 함수를 쉘 명령어처럼 사용할 수 있음.
- source 명령이나 도트(.) 명령으로 쉘 스크립트를 실행하면 함수 정의가 현재 쉘 환경에 추가됨.
함수 정의 방법
function name {
command ...
return
}
name() {
command ...
return
}
- return [n] 문은 함수를 종료하는 문장으로 종료 상탯값을 리턴할 수 있음(n이 생량되면 직전 명령의 종료 상탯값을 리턴)
- 함수 정의를 항상 사용하려면 .bashrc에 넣는것이 좋음
- alias 설정도 마찬가지.
함수 실행 예
[ec2-user@ip-aws ~]$ touch whoson.sh
[ec2-user@ip-aws ~]$ vi whoson.sh
[ec2-user@ip-aws ~]$ cat whoson.sh
#!/bin/bash
whoson () {
date
user=$USER
echo "$user currently logged on"
}
echo "STEP 1"
whoson
echo "STEP 3"
[ec2-user@ip-aws ~]$ . whoson.sh
STEP 1
Thu Nov 5 12:50:41 UTC 2020
ec2-user currently logged on
STEP 3
[ec2-user@ip-aws ~]$
[ec2-user@ip-aws ~]$ . whoson.sh
STEP 1
Thu Nov 5 12:50:59 UTC 2020
ec2-user currently logged on
STEP 3
[ec2-user@ip-aws ~]$ whoson
Thu Nov 5 12:51:19 UTC 2020
ec2-user currently logged on
[ec2-user@ip-aws ~]$ echo $user
ec2-user
[ec2-user@ip-aws ~]$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
[ec2-user@ip-aws ~]$ vi ~/.bashrc
[ec2-user@ip-aws ~]$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
arg1 () {
echo "$1"
}
ds() {
echo "DISK DPACE UTILIZATION FOR $USER"
du -sh ~
}
[ec2-user@ip-aws ~]$ . ~/.bashrc
[ec2-user@ip-aws ~]$ arg1 first
first
[ec2-user@ip-aws ~]$ ds
DISK DPACE UTILIZATION FOR ec2-user
80K /home/ec2-user
728x90
반응형