Seung Hun

ChatGPT_Image_2025%E1%84%82%E1%85%A7%E1%86%AB_6%E1%84%8B%E1%85%AF%E1%86%AF_6%E1%84%8B%E1%85%B5%E1%86%AF_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_08_45_46.webp

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

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


Shell Script란?

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

Hello World

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

이것을 실행시키면

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-06_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_8.59.33.png

이런 결과가 나옵니다.

기본 문법

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

Shebang

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

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

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

변수 선언

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

#!/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

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

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[*]}

조건문

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

이런 구조의 문법입니다.

#!/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

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

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-07_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_1.44.54.png

조건식

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

반복문

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. 입력 받은 나이와 같은 유저의 이름을 출력한다.
#!/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'

이 스크립트를 실행하면

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-06-07_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_2.29.27.png

이런 결과가 나옵니다.