본문 바로가기
개발/LINUX

Linux / Shell Script 시작하기

by 개발자 구리 2022. 1. 21.

일한지 3년이 다 되어가는데 아직도 회사일은 새로움의 연속이다.

지난주에는 갑자기 Shell Script로 자동화 툴을 만들라는 요청을 받아서, 개념을 잘 이해하지 못한 채로 3일을 갈아넣어서 개발을 완료했다.

사실 한 번 짜보고 싶었던거라 재미..도 조금 있었고(일정에 너무 쪼여서 힘들긴했다) 알아두면 유용하게 쓰이는 내용이 많은 것 같아서

블로그에 정리해두려고 한다.

 


시작하기

 

vi 등의 에디터로 파일을 생성하고, 제일 윗줄에 #!/bin/bash를 입력한다.

관습적으로 shell script라는 것을 표시하기 위해 .sh 확장자를 사용하지만, 실제로 확장자 명이나 확장자의 유무는 프로그램의 실행에 아무런 영향이 없다.

 

 

출력하기

 

echo는 자동으로 줄바꿈을 시켜주고,

printf는 줄바꿈이 안된다.

❯ ./Script.sh

Hello World!
Hello World!
Hello World!Hello World!

 

 

변수 선언

 

변수에는 자료형을 기입하지 않는다.

변수에는 모든 값이 문자열로 저장된다.

값을 사용할 때는 변수명 앞에 $를 사용한다.

값을 삽입할때는 $를 사용하지 않고, "=" 앞뒤로 공백이 없이 입력해야 한다.

 

선언된 변수는 기본적으로 전역변수이며, 함수 안에서 local을 붙여주면 지역변수가 된다.

❯ ./Script.sh

1

a

alphabet

a

 

 

인자 변수

 

shell script 작동시 인자로 넘겨주는 변수이다. 순서대로 $1, $2, $3 ...

$*는 전달된 인자 모두이며, $#으로는 전달된 인자 개수를 알 수 있다.

❯ ./Script.sh 123abc ㄱㄴㄷ

123

abc

ㄱㄴㄷ

123 abc ㄱㄴㄷ

3

 

 

if문

 

if문 뒤에 나오는 대괄호 사이에 공백을 넣어주어야 한다.

조건문 안에서 값을 비교하기위해 사용할 수 있는 함수는 꽤나 다양하다.

정수 비교시 eq(equal), ne(not equal), gt(greater than), ge(greater or equal), lt(less than), le(less or equal)

<, >, ==와 같은 부호도 사용 가능한데, [ ]대신 (( ))를 사용해야 한다.

❯ ./Script.sh

변수의 값이 같습니다.

❯ ./Script.sh

10 is equal to 10

 

 

for문

 

(( ))를 사용해서 초기값; 조건값; 증가값;으로 for문을 사용하는 것이 가장 익숙한 것 같다.

❯ ./Script.sh

1

2

3

4

 

 

while문

 

우선 if문, for문과 마찬가지로 대괄호를 사용하는 것이 일반적이나, (( ))를 사용하여 부등호를 사용할수도 있다.

그리고 while문의 경우 루프를 탈출하기 위해 index의 값을 1씩 증가시키려고 했는데,

index=$index+1이나 index=$(index+1)은 의도한 동작을 하지 않고

index=$((index+1))을 해야만 의도한 동작을 할 수 있었다.

❯ ./Script.sh
0
1
2
3
4

 

 

함수

 

function을 생략 가능하고, 인자는 띄어쓰기로 구분해서 전달하고, 함수 내에서는 인자를 $1 $2 ... 로 사용한다.

주의할 점은 호출부가 함수가 정의된 곳보다 반드시 뒤에 있어야 한다는 점이다.

❯ ./Script2.sh

Hello World

Hello World

 

 

예약 변수

 

말 그대로 그 쓰임이 예약되어있는 변수를 뜻한다. 요론 블로그에 잘 정리되어 있으니 따로 정리는 안하고..

궁금했던 PS3만 써봐야지.

 

https://blog.gaerae.com/2015/01/bash-hello-world.html

 

Bash 입문자를 위한 핵심 요약 정리 (Shell Script)

 

blog.gaerae.com

 

구글링 하면 찾을 수 있는 예제이다. select 명령어를 통해 사용자에게 선택 가능한 메뉴를 보여주고 입력을 받을 수 있는데,

❯ ./Script2.sh
1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 2
Tuesday
#?

 

PS3을 사용하지 않는 경우 위와같이 #? 뒤에 사용자가 입력을 하게 된다.

PS3을 사용하는 경우에는 아래와같이 사용자에게 설명을 제공할 수 있다.

❯ ./Script2.sh
1) mon
2) tue
3) wed
4) exit
Please Select one(1-3) : 1
Monday
Please Select one(1-3) : 2
Tuesday
Please Select one(1-3) :

 

 

배열

 

배열 변수를 사용할때는 반드시 중괄호를 사용해야 하며, 1차원 배열만 지원한다.

❯ ./Script.sh
array: 0 1 2 3 4
array_new: 0 1 2 3 4 5
array 일부 출력: 0 3
array 전체 출력: 0 1 2 3 4
array 전체 개수 출력: 5
array 전체 출력: 0 1 2 3
array 전체 출력:

 

 

선택문

❯ ./Script2.sh
Hello! Select the option : [1] [2] [3]
1
[1] haha