728x90

쉘스크립트를 통해 주기적인 '백업', 시스템 모니터링 등 반복 작업을 자동화할 수 있다.

쉘스크립트는 프로그래밍언어에 비해 문법이 간단하여 작성하기 쉽고 빠르게 작성할 수 있다. 또한 '인터프리터(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://www.javatpoint.com/shell-script-parameters

 

출처: 이것이 리눅스다 CentOS 8

 

 

 

 

 

 

https://en.wikipedia.org/wiki/ASCII

 

ASCII - Wikipedia

From Wikipedia, the free encyclopedia American character encoding standard ASCIIMIME / IANAus-asciiAlias(es)ISO-IR-006,[1] ANSI_X3.4-1968, ANSI_X3.4-1986, ISO_646.irv:1991, ISO646-US, us, IBM367, cp367[2]Language(s)English (made for, does not support all l

en.wikipedia.org

 

'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

+ Recent posts