Knowhow/Linux

Shell script 기본 사용법 정리

침닦는수건 2023. 8. 7. 16:52
반응형

쉘 스크립트를 잘 사용하지 않았는데, 커맨드를 자동으로 넣어주도록 하는 작업이 꽤 빈번하게 필요해서 한 번 정리해보고자 한다. 복잡한 스크립트를 짜기 위함이라기보다 반복 실험이나 반복 실행처럼 단순 노가다성 작업이나 argument만 바뀔 뿐 커맨드는 같은 작업을 최소화하는 수준을 익히는데 초점을 두고 정리했다. 

 

기본 세팅

shell script를 작성할 때, 기본적으로 첫줄에 #!/bin/bash를 적어두는 것이 일반적이다. 또한, shell script 실행 권한을 부여하는 작업을 해두어야 한다. 777은 읽고 쓰기 모두 부여하는 권한이므로 만약 write를 막아두고 싶다면 다른 숫자를 부여하면 된다.

sudo chmod 777 YOUR_SCRIPT.sh

권한 번호 세자리는 파일 소유자/파일 그룹/다른 모든 사용자 순서로 각각의 권한을 나타내는데, r(읽기) 4 / w(쓰기) 2 / x(실행) 1 / 권한없음 0 중 원하는 레벨의 권한을 합친 수로 기재하면 된다. 

 

예를 들면, 5(4+1) 은 읽기와 실행 권한, 7(4+2+1)은 읽기와 쓰기와 실행 권한이 있음을 의미한다. 

 

script는 일반적으로 실행하기 위한 파일이니 1이 반드시 포함되어 있어야 한다.

 

변수 정의

변수명 = 변수 내용
my_string = "example string"
my_int = 4

리스트명 = (내용1, 내용2, 내용3)
my_list = ("element1", "element2", ...)

변수 생성과 리스트 생성은 설명이 크게 필요없을 정도로 간단하다. 

 

변수 인덱싱은 조금 기억할 것들이 있는데 $ 기호를 기본으로 하되 다음과 같은 룰이 있다.

echo $my_string // 단일 변수 접근
echo $my_int

echo ${my_list[0]} // 리스트 변수 접근
echo ${my_list[@]} // 리스트 변수 전체 접근 1
echo ${my_list[*]} // 리스트 변수 전체 접근 2

echo ${#my_list[*]} // 리스트 크기

리스트 변수를 다룰 때 유의사항은 {} 괄호를 꼭 붙여야한다는 것이다. $my_list[0]과 같이 써버리면 my_list 자체를 지정 + [0]이라는 string 조합으로 이해되어서 정상 동작하지 않는다.

 

추가로, 자체적으로 정의가 이미 되어있는 변수들이 있는데 아래 요소들은 외워두면 좋다.

$$ // process id (pid)
$0 // shell script name
$1~$9 // argument index
$* // all arguments
$# // the number of arguments 
$? // return of the latest command in shell script 

return :
0 // success
1~125 // errors
126 // file is not executable 
128~255 // some signal occur

 

조건문 if

if [ condition ]
then 
	command0
else 
	command1
fi

유의사항은 condition 앞뒤로 띄어쓰기를 넣어주는 것을 잊지 말것.

 

추가로 ==, !=, &&, ||은 기본적으로 쓸 수 있지만 >, <, >=, <=와 같은 조건문은 별도로 문법으로 쓰는게 국룰이다.

A -eq B // ==
A -ne B // !=
A -lt B // <     
A -le B // <=    
A -gt B // >     
A -ge B // >=    
A -a B // and 
A -o B // or


-e $path // file exists?
-d $path // is directory?
-r $path // is readable?
-w $path // is writable?
-x $path // is executable?
-s $path // is not empty? not 0byte?

 

하나 팁은 한 줄로 몰아서 if 문을 쓸 수도 있는데 다음과 같이 ;으로 구분하면 된다.

if [ 조건 ]; then command0; fi

역시나 조건 앞뒤로 띄어쓰기 빼먹지 말자.

 

반복문 for

for variable in $my_list
do
	command0 with $variable
done

---
for variable in $my_list; do
	command0 with $variable
done

---
for variable in $my_list; do; command0 with $variable; done

특별한 건 없다. 하나 헷갈릴만한 것들을 $를 붙이는 위치인데, 이미 생성된 것을 사용할 때는 $ 붙이고 새로 생성되는 것에는 안 붙인다라고 기억하면 편하다. variable은 for loop 안에서 새로 생성되는 것이니 붙이지 않고, my_list는 생성된 것을 사용하는 것이니 붙이는 것이다. 

 

반복문 while

if 문과 for loop의 조합이라고 봐도 무방하다.

while [ 조건 ]
do
	command0
done

위 for loop를 보면 흔히 사용하는 index iteration보다 item iteration할 때 쓰게 되는데, while 문은 index iteration하고자 할 때 빈번하게 쓰인다. 

 

예를 들면, 다음과 같이 while문을 구현해서 0, 1, 2, 3, ... index iteration을 구현해서 쓴다.

lists=$(ls)
num_items=${#lists[@]}
index=0
while [ $num_items -ge 0 ]
do
     echo ${lists[$index]}
     index=`expr $index + 1`
     num_items=`expr $num_items - 1`
done

참고로, expr은 사칙연산 command이다. (, ), * 세가지 연산자 앞에는 \를 붙여서 사용해야 한다. \(, \), \*

 

참고 링크

https://probe29.tistory.com/47

 

쉘(bash Shell) 스크립트 기본 문법, 실제 예제(백업하기, 로그 파일 정리하기)

#쉘 스크립트 서버 작업 자동화 및 운영(DevOps)을 위해 기본적으로 익혀둘 필요가 있다. 쉘 명령어를 기본으로 하되, 몇 가지 문법이 추가된 형태 시스템 프로그래밍에서 꼭 익히는 내용 중 하나

probe29.tistory.com

 

반응형