오늘 미션은 Linux Shell 이용해 Script 파일을 작성하고 파일 압축, 컴파일, 배포해보는 과정이었다. 두 번째 과제로 모든 .js 확장자 파일을 압축하는 Shell Script 작성하는 것이었다. Shell를 이용해서 코드를 작성하려다 보니 상당히 삽질을 했다. 처음 설계는 이랬다.

  1. 임시 디렉토리를 생성
  2. 재귀적으로 디렉토리를 탐색
  3. .js 확장자 파일 임시 디렉토리로 복사

결과는 잘나왔지만, shell script에서 함수 반환값 처리를 제대로 하지 못하였다.

Shell Script에서 함수 반환값을 받는 방법은 두 가지가 있다.(참고)

  • $(명령어 or 쉘 스크립트 실행 or 쉘 스크립트 함수)SubShell을 호출한다.
  • SubShell은 부모 Shell의 변수, 함수 참조가 가능하지만, SubShell 결과가 부모 Shell에 영향을 미치지 않는다.

함수 반환값 이용해 구현하기 힘들다고 판단하여 코드를 수정해보았다.

#!/bin/bash

#
# 기존 파일 제거
#
function remove {
    rm -f backup.zip
    rm -r temp
}

#
# temp 디렉터리 생성
#
function mkDir {
    mkdir -p temp
}

#
# 현재 디렉토리에서 .js 확장자 파일 존재하면 temp 디렉토리로 복사
#
# 파라미터 : temp 디렉터리 경로
#
function copy {
    for file in *.js ;do
        if [ ${file} != "*.js" ]
        then
          cp ${file} "${1}/${file}"
        else
          echo "${dir} is empty\n"
        fi
    done

}

#
# day 디렉터리 이동 후, copy 함수 호출
#
# copy 호출 전에 해당 day 디렉토리로 이동(change directory)
#
# 파라미터 : temp 디렉터리 경로
#
function change {
    for dir in * ;do
        if [ ${dir} != 'temp' ] && [ -d ${dir} ]
        then
            cd ${dir}
            copy ${1}
            cd ..
        fi
    done

}

#
# zip 압축
#
function compress {
    zip -r ./backup.zip ./temp/*

}

#
# remote 서버에 파일 업로드
#
# backup_오늘날짜.zip 형식으로 파일명 변경
# ex) backup_20110901.zip
#
function copyRemote {
    scp backup.zip ${1}@10.81.25.166:"backup_$(date +%Y%m%d)"".zip"

}

#
# start
#
# 프로그램 파라미터 : 서버 아이디
#
remove
mkDir
change $(pwd)'/temp'
compress
copyRemote $1

해설 강의 코드를 보면 간결하다. 이중 For 문과 정규식을 이용해 끝내버렸다..

files=()                        # 배열 선언
function change {
    for dir in * ;do            # 첫 루프
      for f in ${dir}/*.js ;do    # 두 번째 루프
        if [ ${f} != "${dir}/*.js" ]
        then
          files+=(${f})
        elif [ -d ${dir} ]
        then
          echo "${dir} is empty"
        fi
      done
    done

}
  • 첫 번째 for 문은 모든 파일을 돈다.
  • 두 번째 for 문은 해당 디렉토리 아래 .js 확장자를 가진 파일만 돈다.

여기서 헷갈렸던 것이, ${dir}/.js 조건이 없으면 해당 문자열(ex> "temp/.js") 로 루프를 한 번 돈다. 조건식에서 정규식으로 만족하는 항목이 없으면, 해당 조건식을 문자열로 인식하는 것으로 생각된다.

뭔가 급하다...
미션 해결이 중요한게 아니라, 좋은 코드를 짜기 위한 고민이 중요하다.
설계부터 하는 습관을 들이자