[리눅스] 쉘 스크립트 인자, 사칙연산, 조건문

changhoji·2023년 6월 21일

Linux

목록 보기
1/1

서론

백준 문제풀이 저장소를 새로 만들었는데, 폴더를 나누지 않고 다 집어넣으면 한 폴더에 항목이 너무 많아질것 같아 다음과 같이 폴더 구조를 정했다.

  • baekjoon
    • 01
      • 1000
        • solution.cpp
      • 1008
        • solution.cpp
    • 02
      • 2013
        • solution.cpp
    • 10
      • 10871
        • solution.py
    • 11
      • 11111
        • solution.js

다만 만들고 나니 새로 문제를 풀 때마다 폴더를 만들고, solution 소스파일을 만들고, 나중에 컴파일 후 실행하기 위해 해당 경로로 이동하는 과정이 매우 귀찮게 느껴졌다..

따라서 이를 쉘 스크립트를 이용해 편하게 만들어 보고자 정보를 알아보게 되었다.

인자

쉘 스크립트에서 인자를 받는 방법은 간단하다. $1와 같이 쓰면 첫번째 인자를, $2와 같이 쓰면 두번째 인자를 나타내는 식으로 작동하게 된다.

# test.sh

echo $1
./test.sh hello!

예를 들어 왼쪽과 같이 쉘 스크립트를 작성하고 오른쪽과 같이 실행하면 hello!가 쉘에 출력된다.

이를 사용해 내가 몇번 문제의 폴더를 만드려 하는지 넘겨줄 것이다.

사칙연산

다만 내 폴더 구조에서는 baekjoon 폴더 안에 바로 문제 번호로 된 폴더가 있는게 아니라, 문제 번호를 1000으로 나눈 값으로 폴더가 존재하고, 그 밑에 해당하는 문제 폴더를 모아두는 형식이기 때문에 문제 번호를 1000으로 나눠 우선 상위 디렉토리에 접근해야 한다.

이를 위해 사칙연산을 하는 법에 대해 알아보았다.

먼저, expr 커맨드를 이용해 계산하는 방법이 있다. ex) $(expr 10 + $variable)

num=$1
head=$(expr $num / 1000)

이때 head에는 첫번째 인자를 1000으로 나눈 몫이 저장되게 된다.

이때 연산자로는 기본적인 + - * / %, 그리고 | & = > < >= <= != : ()가 존재한다.

expr를 이용해서 문제 번호에 해당하는 상위 디렉토리 명을 구할수는 있었지만 문제번호가 1000인 경우에 디렉토리 명을 ‘1’로 하지 않고 ‘01’같이 두자리를 지켜 만들고 있기 때문에 이에 대한 예외처리가 필요하다. 또한 상위 01같은 상위 디렉토리가 존재하지 않을 때만 만들어야 하기 때문에 이를 확인하기 위해서도 if문이 필요하다.

조건문

조건문은 다음과 같은 형식으로 사용한다.

if [ 10 -lt 20 ]; then
	echo "hello"
else
	echo "world"
fi

해당 스크립트를 실행하면 if에서 조건을 검사하는데, 옵션이 -lt, 즉 less than 이므로 10과 20을 비교한다. 이때 10이 20보다 작으므로 조건이 참이 되어 hello가 출력된다.

조건문 옵션에는 -eq -ne -gt -ge -lt -le등이 있다.

결론

앞에서 알게 된 내용들을 바탕으로 두가지 파일을 만들었다.

우선 edit.sh 파일은 첫번째 인자로 준 문제 번호를 가지고 그 문제 폴더가 있는 경로로 이동해 solution.cpp를 바로 편집할 수 있도록 여는 스크립트이다.

num=$1
head=$(expr $num / 1000)

if [ $head -lt 10 ]; then
    if [ ! -d ./0$head ]; then
        mkdir 0$head
    fi
    cd 0$head
else
    if [ ! -d ./$head ]; then
        mkdir $head
        echo "hi.."
    fi
    cd $head
fi

if [ ! -d ./$1 ]; then
    mkdir $1
fi
cd $1

code solution.cpp

간단하게 설명하자면, num은 문제번호, head는 문제 폴더의 상위 폴더의 이름이고, 만약 head가 한자리라면 앞에 0을 붙인 폴더에 접근한다. 이때 폴더가 존재하지 않는다면 mkdir로 생성하는 과정을 거친다.

그 후에 문제 번호 폴더로 이동하고, solution.cpp를 code로 연다.

그 다음 run.sh 파일은 다음과 같은데, 폴더가 만들어져 있다고 가정하고, 이동한 후 컴파일해서 실행하게 된다.

num=$1
head=$(expr $num / 1000)

if [ $head -lt 10 ]; then
    cd 0$head
else
    cd $head
fi
cd $1
g++ solution.cpp
./a.out
profile
changhoji

0개의 댓글