[Linux] shell script (2)

한호성·2023년 6월 14일

shell script

목록 보기
2/2

Introduction

Shell Script를 활용하여서, 간단한 작업을 자동화할 필요가 있었다.

자동화를 시키기 위해 파이썬을 사용할 수 도 있었지만, Java 기반으로 개발을 하고 있기도 하고, 개발팀원 모두가 설치없이 사용할 수 있도록 Shell Script로 쓰기로 결정했다.

이전에 개인 프로젝트에서 자동배포할 때, Shell Script를 사용했는데, 자세히 공부를 하지 못하고 넘어간 것이 걸려서, 요번에 한번 공부한 내용을 작성해보도록 하겠다.

[목차]

  • Shell Scirpt란?
  • 기본 문법 정리
  • 내가 짠 코드 전문에서 사용된 문법 공부해보기
  • 내가 사용한 코드에서의 유의사항 및 개선점에 대해 고민해보기

내가 짠 코드 전문에서 사용된 문법 공부해보기


1 IFS ?
2 (ECHO−n"line" | tr -d '["cntrl:]')
3 이중대괄호 [[ ]]
4 sed -i "/file_end_pattern/i contenttoinsert""outputfile"5csvKeyArray+=("content_to_insert" "output_file" 5 csvKeyArray+=("key")

하나씩 차근차근 알아가 보도록 하자.

IFS


IFS(Internal Field Separator)는 특수한 환경 변수로 bash 쉘이 필드 구분자로 사용하는 문자의 목록을 정의합니다.

기본 값은 빈 칸이다.

자주 쓰이는 필드 구분자 ‘\ n’ , ‘:’ , ‘;’, “ “ ”, …

‘\n’인 경우에만 $를 붙여서 지정해주고, 나머지 필드 구분자는 IFS=:, IFS=… 등으로 지정합니다.

요약하자면, File을 읽고, 어떤 구분자로 나눠서 값을 변수에 저장할 것이냐를 의미한다고 생각하면 된다. 나같은 경우 csv파일을 읽어서 처리하는 경우가 많아서 , 로 설정했엇다.

line=(echon"(echo -n "line" | tr -d '[:cntrl:]' )


몇가지로 쪼개서 설명해보도록 하겠습니다.

1.echo -n “$line” echo 는 기본적으로 newline \n 이 붙어서 나오는데, -n인 경우 \n을 생략하는 옵션이다.

2.| tr -d 는 input 값들 중 특별한 문자를 지우겠다는 의미입니다. ‘[:cntrl:]’ 은 모든 제어문자를 의미합니다.

이제 이 2개를 조합해서 생각해보면 $line 이라는 변수 값을 출력하는데, \n은 빼고, 제어문자는 제거해서 line이란 변수에 다시 대입하는 수식입니다. ( 제어문자의 종류로는 Line Feed LF , Carriage Returen CR, Tab, Backspace, From Feed, Escape, Null 이 있습니다.)

이중대괄호 [[]]


[[ $line == *"${javaKeyPrefix}"* ]]

&& || ,=~*(정규식매칭) 확장 expression test 기능을 대괄호 내에서 사용할 수 있도록 해주는 역할을 합니다.

위 식은 $line 변수안에, String(javaKeyPrefix) 값이 존재하는지 확인하는 수식입니다.

array += (”element”)


Array 변수에, 새로운 element를 넣는 수식입니다.

sed -i "/file_end_pattern/i $content_to_insert" "output_file"


sed : 유닉스 계열의 운영체제의 stream editor 입니다.

-i option : 삽입을 의미합니다 (insert)

“/file_end_pattern/i $content_to_insert” ”output_file”

file_end_pattern이라는 변수값 위에다 content_to_insert string 값을 넣겠다는 것을 의미하고, 제일 마지막 $output_file은 파일 경로를 의미합니다.

내가 사용한 코드에서의 유의사항 및 개선점에 대해 고민해보기


우선 반 자동화가 가능하도록, shell script를 짯는데, 이 부분에 있어서 깊게 생각해보는 시간이 부족한거 같아서 글을 적는 시간을 갖도록 하겠습니다.

우선 개선점에 대해 고민하기 전에, 내가 짠 코드를 사용할 때 유의해야할 점들에 대해 생각해보겠습니다..

기능을 사용할 때, 유의 해야한다는 것은 어떻게 보면, 사용자에게 불편함을 주는 것이므로 개선점과도 연관이 있다고 생각합니다.

유의사항

  • CSV 파일을 ‘,’ (콤마) 로 구분하기 때문에, Notion 데이터 작성할 때, 콤마 를 빼고 작성해주세요
    Or Csv 파일 만든 후, Comma 를 전체 찾기 후 제거 해주셔도 됩니다.

  • 파일경로, 및 Message Index를 잘 확인하여 주세요

  • 기존의 코딩되어있는 부분은 삭제처리되지 않고 유지됩니다. 추가항목들만 제일 하단에 추가됩니다.

  • 들여쓰기가 되지 않으니 ctrl+alt+l 로 줄 정렬 해주시면 감사하겠습니다.

개발 시, 고민했던 내용

고려했던 부분을 써보겠습니다.

기본적으로 notion database 표 내용을 csv로 바꿔서, shell script 돌려서, java 코드로 변환하는 작업이다.

  1. 사용할 언어에 대한 고민

우선 언어에 대한 부분, python으로 짜는게 압도적으로 편했을수도 있다 생각한다. 다만, 다른 개발팀원이 python을 깔아야하는 경우, 아예 사용안하게 될 수 도 있다 생각해서 우선 보류했다.

  1. Java project 빌드 시, 자동으로 shell 실행에 대한 고민

Gradle build 시 의존성을 주어서, 자동으로 task가 작동하도록 하려고했지만, window는 기본적으로 shell script를 작동하기 위해서 gitbash 혹은 WSL이 깔려있어서, .EXE 파일 경로를 알아야하는데 이는 환경마다 다르기 때문에, 이부분도 보류하였다.

  1. 방식의 문제

직접적으로 source code 파일을 읽고, 코딩이 아닌, 해당하는 값을 직접적으로 바꾸는 것이 맞는것인지 고민했습니다..
(너무 원시적인 느낌이 났음. 일단 생각나는 방법이 이것이여서, 개발을 진행하였습니다.)

개선점

  1. 다음번에 비슷한 개발할 때는 우선, 언어를 바꿔서 편하게 개발할 수 있도록 생각할 생각입니다.
  2. .bat 실행파일을 만드는것에 대해 고민해볼 생각입니다 (개발팀원마다 운영체제가 달라서 의미가 있을지 추가 고민).
  3. 방식, 직접 파일을 수정하는것이 아닌, 다른 방식을 고려해볼 생각입니다. (.properties) 파일을 이용해서, Spring 에서 제공하는 방식을 활용하여, Source code에는 변화없이 진행하도록.
  4. Static String 들을 다른 프로젝트에서는 어떻게 관리하는지 조금 더 조사해볼 필요를 느꼈습니다.
profile
개발자 지망생입니다.

0개의 댓글