Seung Hun

2025년 6월 7일

Shell Script 기본 문법 정리 및 사용해보기

이번에 회사에서 GitHub Actions의 self-hosted runner를 세팅하면서, 자동으로 환경을 설정해주는 스크립트를 shell script로 작성했습니다. 처음에는 GPT에게 요구사항을 전달하고, 추천받은 코드를 그대로 복사해 사용하는 방식으로 개발을 진행했는데, 아무것도 모른 채 너무 의존하고 있다는 생각이 들었습니다. 그래서 이번 기회를 통해 shell script를 제대로 공부하고, 배운 내용을 정리해보려고 합니다.


Shell Script란?

유닉스, 리눅스 환경에서 사용하는 명령어들을 모아둔 실행 파일을 의미합니다. 즉 터미널에서 입력하는 여러 명령어들을 한 번에 자동으로 실행하는 스크립트 파일입니다.

Hello World

shell
#!/bin/bash
echo "Hello, World!"

이것을 실행시키면

이런 결과가 나옵니다.

기본 문법

이제 기본 문법에 대해서 알아보겠습니다.

Shebang

저 Hellow World 스크립트를 보면 #!/bin/bash 이 있는데 이것은 Shebang이라고 합니다.

shell
#!/bin/bash
#!/bin/zsh

이 스크립트를 어떤 셸로 실행할지 지정하는 선언할 수 있습니다.

변수 선언

변수명=값으로 선언 가능합니다.

shell
#!/bin/bash

stringVariable="string variable"
echo $stringVariable

integerVariable=10
echo $integerVariable

floatVariable=10.5
echo $floatVariable

booleanVariable=true
echo $booleanVariable

arrayVariable=(1 2 3 4 5)
echo ${arrayVariable[1]}

# object는 bash 4.0 이상에서 지원
declare -A associativeArrayVariable
associativeArrayVariable=([name]="John" [age]=20)
echo ${associativeArrayVariable[name]}

# 환경변수
export myVariable="my variable"
echo $myVariable

object는 bash기준 4.0버전 이상부터 사용 가능하다.

array

배열에 대해서 좀 더 알아보겠습니다.

shell
arr1=(1 2 3 4 5)
arr2=([0]="apple" [1]="banana" [2]="cherry")

# 배열 길이
echo ${#arr1[@]}
echo ${#arr2[*]}

# 배열에서 특정 요소 출력
echo ${arr1[0]}
echo ${arr2[1]}

# 배열 추가
arr1+=(6 7 8)
arr2[${#arr2[*]}]="orange"
echo ${arr1[*]}
echo ${arr2[*]}

# 배열 삭제
unset arr1[${#arr1[*]}-1] # 배열 길이를 사용하여 마지막 요소 삭제
echo ${arr1[*]}

조건문

shell
if [ 값1 조건식 값2 ]; then
	실행문 
elif [ 값1 조건식 값2 ]; then
	실행문
else
	실행문
fi

이런 구조의 문법입니다.

shell
#!/bin/bash

currentMs=$(date +%s)

if [ $(($currentMs % 2)) -eq 0 ]; then
    echo "even"
else
    echo "odd"
fi

number=1

if [ $number -eq 1 ]; then
    echo "number is 1"
elif [ $number -eq 2 ]; then
    echo "number is 2"
else
    echo "number is not 1 or 2"
fi

이렇게 사용이 가능합니다.

조건식

조건문에서 사용할 수 있는 조건식들은 다음과 같습니다.

  • -eq: 앞 뒤 값이 같으면 true
  • -ne: 앞 뒤 값이 다르면 true
  • -gt: 앞이 뒤보다 크면 true
  • -ge: 앞이 뒤보다 크거나 같으면 true
  • -lt: 앞이 뒤보다 작으면 true
  • -le: 앞이 뒤보다 작거나 같으면 true
  • -a: &조건
  • -o: |조건
  • -z: 문자열 길이가 0이면 true
  • -n: 문자열 길이가 0이 아니면 true

반복문

shell
for ((i=0; i<=10; i++)); do
    echo $i #0 1 2 3 4 5 6 7 8 9 10
done

for i in {1..10}; do
    echo $i #0 1 2 3 4 5 6 7 8 9 10
done

for i in $(seq 1 10); do
    echo $i #0 1 2 3 4 5 6 7 8 9 10
done

arr=(1 2 3 4 5)
for i in ${arr[@]}; do
    echo $i #0 1 2 3 4 5
done

간단한 기능 구현

  1. 유저의 나이를 입력 받는다.
  2. https://dummyjson.com/users를 통해 유저 정보를 가져온다.
  3. 입력 받은 나이와 같은 유저의 이름을 출력한다.
shell
#!/bin/bash

echo -n "유저의 나이를 입력해주세요: "
read inputAge #사용자 입력을 받고 저장

curl -s 'https://dummyjson.com/users' | jq -r \ #jq를 사용하면 JSON 파싱을 쉽게 있습니다.
  --arg age "$inputAge" \
  '.users[] | select(.age == ($age | tonumber)) | .firstName'

이 스크립트를 실행하면

이런 결과가 나옵니다.