쉘스크립트를 통해 주기적인 '백업', 시스템 모니터링 등 반복 작업을 자동화할 수 있다.
쉘스크립트는 프로그래밍언어에 비해 문법이 간단하여 작성하기 쉽고 빠르게 작성할 수 있다. 또한 '인터프리터(ex. Python. 프로그래밍 언어의 소스코드를 '바이너리'로의 변환과정없이 텍스트의 구문을 해석하여 바로 실행하는 방식)'가 명령어 해석을 바로바로 하기 때문에 디버깅이 쉽다. (컴파일 방식은 C/C++, Java, Swift, Kotlin 등)
cf. 인터프리터
(2) 쉘 스크립트 형식
첫번째 줄에는 해당 스크립트가 사용할 쉘을 '#!'을 통하여 명시한다.
#!(shebang)
- 실행파일은 바이너리 형태이거나 스크립트처럼 텍스트 형태일 수 있는데 "프로그램 로더(program loader)"는 '#!' 매직넘버를 통해 '실행파일'인지 '바이너리(binary)'인지 '스크립트'인지 구분할 수 있다.
- '#!' 이후에 실행할 쉘 종류를 지정하기 때문에 프로그램 로더는 지정한 쉘을 통하여 스크립트를 실행할 수 있게 된다.
cf. 프로그램 로더(program loader) : 하드디스크와 같은 외부기억장치에서 메모리와 같은 주기억장치에 프로그램을 적재하고 실행하는 역할을 수행하는 시스템 프로그램이다.
cf. magic number : 프로그램이 대상을 식별하기 위해 개발자가 지정한 고유한 값이다. '프로그램 로더(program loader)'는 바이너리인지 스크립트인지 구분하기 위해 파일의 시작이 '#!'의 'Hex값'인 0x023, 0x21 로 시작하는지 확인한다.
(3) 쉘 스크립트 실행
- 쉘 스크립트를 실행할 때 별도의 프로세스로 실행하는 방법과 현재 쉘에서 바로 실행하는 방법이 있다.
- 별도의 프로세스로 실행하기 위해서는 스크립트 파일의 permission에 실행권한(rwx에서 x)을 주고(chmod로 권한 변경해주고) 실행한다. 이때 현재 경로( ./ )를 의미하는 " ./ " 를 꼭 붙여야 한다.
쉘 스크립트 실행할 때 " ./ "를 붙이는 이유는?
쉘은 '환경변수 PATH'에 지정된 경로에만 실행 파일을 찾기 때문에 " ./ "를 꼭 붙여야 한다.
$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/francis/bin
$ chmod +x hello.sh
$ ./hello.sh
//$ chmod +할지 -할지 [그 대상] 명령어 사이 공백주고, 현재 경로( ./ )에 있는 파일 실행
실행할 때 '쉘의 인자'로 스크립트 파일 경로를 넘겨서 직접 실행할 수도 있다. (더 자세히)
$ bash hello.sh
Hello World!
현재 쉘에서 바로 실행하기 위해서는 'source 명령어' 또는 'dot(.)명령어'를 이용하여 실행한다.
# source를 사용하여 실행하기
$ source hello.sh
# .을 사용하여 실행하기
$ . hello.sh
*쉘의 스크립트 실행 방식의 차이 이해하기
쉘이 스크립트를 '별도의 프로세스로 분리하여 실행하는지' 현재 쉘 상에서 실행하는지 확인하기 위해 다음 쉘스크립트를 만들어본다.
#!/bin/bash
exit
bash로 실행해보면 '독립된 프로세스'에서 스크립트가 실행되기 때문에 아무런 일도 일어나지 않는다.
$ bash exit.sh
$
source로 실행해보면 현재 쉘에서 exit 명령어를 사용하였으므로 보고 있던 터미널이 종료된다.
$ source exit.sh
==
[2] 쉘 스크립트 기본 문법
2.1 주석
2.2 변수
2.3 위치매개변수
2.4 echo문
2.5 다양한 조건식
[3] 쉘 스크립트 조건문
[4] 쉘 스크립트 반복문
[5] 쉘 스크립트 함수
[6] 쉘 스크립트의 부문 문자열 제거(substring removal)
[5] 쉘 스크립트 함수
5.1 함수 구문 문법
함수의 정의는 function 지시어를 통해 함수 이름을 선언하고 함수가 수행할 명령문을 기술한다.
function 함수명
{
명령문
}
함수의 호출은 함수명을 명시하여 호출한다.
#!/bin/bash
함수명
[6] 쉘 스크립트의 부문 문자열 제거(substring removal)
6.1 string과 pattern을 비교하여 매칭된 문자열을 소거(removal)하는 4가지 방법
${string#pattern} : 맨 앞부터 패턴과 가장 짧게 매치된 문자열을 지운다.
${string##pattern} : 맨 앞부터 패턴과 가장 길게 매치된 문자열을 지운다.
${string%pattern} : 맨 뒤부터 패턴과 가장 짧게 매치된 문자열을 지운다.
${string%%pattern} : 맨 뒤부터 패턴과 가장 길게 매치된 문자열을 지운다.
ex)
${string#pattern} : 맨 앞부터 패턴과 가장 짧게 매치된 문자열을 지운다.
${string##pattern} : 맨 앞부터 패턴과 가장 길게 매치된 문자열을 지운다.
문자열의 앞부터 A로 시작해서 1로 종료하는 패턴 중 가장 짧은 매칭을 삭제하거나 가장 긴 매칭을 삭제.
STR=ABC123abc123ABC
echo ${STR#A*1} # 결과는 23abc123ABC 으로 출력된다.
echo ${STR##A*1} # 결과는 23ABC 으로 출력된다.
==
1) 쉘스크립트에서의 변수
# testval=hello // 변수대입할때 '='좌우에 공백이 없어야 한다.
# echo $testval // hello 반환됨. 출력할때 '$변수'이런 형식으로.
#!/bin/sh
var="Hello World" #
echo $var # Hello World. $기호 붙여주면서 출력반환
echo "$var" # Hello World. " " 쌍따옴표 double quotation mark와 같이 사용해도 무방.
echo '$var' # $변수명 그대로 출력해야할 때에는 single quotation mark(' ') 사용하여
echo \$var # \(back slash) 역슬래쉬 사용하여 이스케이프 시켜주기
echo 값 입력:
read var # Java의 스캐너처럼 값 입력 받아주기
echo '$var' = $var #
exit 0
2) 쉘스크립트에서의 숫자계산
전제규칙사항
- '변수'에 '대입'된 값은 모두 '문자열'로 취금
- '변수'에 들어 있는 값을 숫자인 경우, 연산(+, -, *, / 등)을 하려면 'expr'을 '$변수' 앞에 붙여줌
- 수식에 괄호 또는 곱하기(*)는 그 앞에 역슬래쉬(\)를 붙여줌
#!/bin/sh
num1=100
num2=$num1+200
echo $num2 #연산자에 의해서 연산이(평가가) 되지 않은 결과를 반환함. 그래서 expr이 필요하다.
num3=`expr $num1 + 200` # `(back tick)
echo $num3
num4='expr \($num1 + 200\) / 10 \* 2' #문자열이 아닌 것으로 인식되게 하려면 이스케이프문자(\) 사용
echo $num4
exit 0
3) 쉘스크립트에서의 파라미터
- 파라미터 변수는 $0, $1, $2...의 형태를 가짐
- '전체' 파라미터는 $*로 표현(*는 와일드카드 성격의 문자, 그 외 git add . 할때 그냥 마침표(period, full stop)도 all을 의미하기도)
https://en.wikipedia.org/wiki/ASCII
'Linux' 카테고리의 다른 글
[Linux] Shell 쉘 정리 (0) | 2023.04.29 |
---|---|
[Linux] rpm, dnf (0) | 2023.04.07 |
[Linux] 명령어 정리 (수정) (0) | 2023.02.03 |
[Linux] Vim 정리(수정 중) (0) | 2023.01.29 |
[Linux] Hyper-V in Windows 11 (1) | 2022.12.04 |