2025년 6월 7일

Shell Script 기본 문법 정리 및 사용해보기
이번에 회사에서 GitHub Actions의 self-hosted runner를 세팅하면서, 자동으로 환경을 설정해주는 스크립트를 shell script로 작성했습니다. 처음에는 GPT에게 요구사항을 전달하고, 추천받은 코드를 그대로 복사해 사용하는 방식으로 개발을 진행했는데, 아무것도 모른 채 너무 의존하고 있다는 생각이 들었습니다. 그래서 이번 기회를 통해 shell script를 제대로 공부하고, 배운 내용을 정리해보려고 합니다.
Shell Script란?
유닉스, 리눅스 환경에서 사용하는 명령어들을 모아둔 실행 파일을 의미합니다. 즉 터미널에서 입력하는 여러 명령어들을 한 번에 자동으로 실행하는 스크립트 파일입니다.
Hello World
#!/bin/bash
echo "Hello, World!"이것을 실행시키면

이런 결과가 나옵니다.
기본 문법
이제 기본 문법에 대해서 알아보겠습니다.
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 $myVariableobject는 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이렇게 사용이 가능합니다.

조건식
조건문에서 사용할 수 있는 조건식들은 다음과 같습니다.
- -eq: 앞 뒤 값이 같으면 true
- -ne: 앞 뒤 값이 다르면 true
- -gt: 앞이 뒤보다 크면 true
- -ge: 앞이 뒤보다 크거나 같으면 true
- -lt: 앞이 뒤보다 작으면 true
- -le: 앞이 뒤보다 작거나 같으면 true
- -a: &조건
- -o: |조건
- -z: 문자열 길이가 0이면 true
- -n: 문자열 길이가 0이 아니면 true
반복문
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간단한 기능 구현
- 유저의 나이를 입력 받는다.
- https://dummyjson.com/users를 통해 유저 정보를 가져온다.
- 입력 받은 나이와 같은 유저의 이름을 출력한다.
#!/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'이 스크립트를 실행하면

이런 결과가 나옵니다.