
이번 포스팅에서는 리눅스에서 자주 사용하는 Shell 스크립트의 기본 개념과 스크립트 파일 구조, 실행 방법, 그리고 가장 많이 쓰이는 if, for 문 예제를 실제 코드 중심으로 정리해보겠다.
리눅스에서 파일은 크게 두 가지 관점으로 볼 수 있다.
예를 들어:
IntelliJ.exe : 윈도우 기준 실행 파일 (더블클릭 또는 명령으로 실행)index.txt : 메모, 설정 등을 적어두는 일반 텍스트 파일리눅스에서는 확장자가 실행 여부를 결정하지 않는다. 대신,
즉, .sh 가 아니어도 실행 권한과 올바른 내용만 있으면 “실행 파일”이 될 수 있다.
.sh 확장자를 많이 사용한다.myscript.sh, deploy.sh, backup.sh확장자는 사람과 도구가 “이건 쉘 스크립트구나”라고 알아보기 쉽게 하기 위한 용도일 뿐, 필수는 아니다.
현재 디렉터리에 있는 스크립트를 실행할 때는 보통 이렇게 쓴다.
./myscript.sh
./ 는 “현재 디렉터리”를 의미한다.myscript.sh 만 치면 PATH에 현재 디렉터리가 포함되지 않은 경우 실행이 되지 않을 수 있다.스크립트를 실행하기 전에 실행 권한(x) 을 부여해야 한다.
chmod u+x myscript.sh
u : 현재 사용자(user)+x : 실행 권한 추가권한을 주고 나면 ./myscript.sh 로 바로 실행이 가능해진다.
실제 스크립트를 작성할 때는 shebang(해시뱅)을 맨 위에 적어주는 것이 좋다.
#!/bin/bash
/bin/sh, /usr/bin/env bash 등 다른 형태를 쓰기도 한다.[📝실전연습] 요구사항
1. /jiyean_dir 위치에 myscript.sh의 쉘 스크립트 생성
2. myscript 스크립트 요구사항
2-1. 스크립트 실행 시 script start 문자열 출력 & 스크립트 종료 시 script end 문자열 출력
2-2. 홈 디렉터리로 이동 후 mydir 폴더 생성
2-3. mydir로 이동 후 file1.txt, file2.txt 생성
2-4. 각각의 파일 내부에 hello Im from file1/file2 문자열 작성
![]() |
|---|
| /jiyean_dir에서 myscript.sh를 생성 후 실행한 화면 → 2-1 요구사항 충족 완료 |
![]() |
|---|
| home/jiyean/mydir 위치에서 file1.txt과 file2.txt cat 실행한 화면 → 2-2~2.4 요구사항 충족 완료 |
Shell 스크립트에서 조건 분기에는 if ~ elif ~ else ~ fi 구조를 사용한다.
if [ 조건 ]; then
# 조건이 참일 때 실행
elif [ 다른 조건 ]; then
# 첫 번째 조건은 거짓이고, 두 번째 조건이 참일 때 실행
else
# 모든 조건이 거짓일 때 실행
fi
정수 비교
-eq : 같음 (==)-ne : 다름 (!=)-gt : 보다 큼 (>)-lt : 보다 작음 (<)-ge : 크거나 같음 (>=)-le : 작거나 같음 (<=)[ 1 -gt 2 ] → 1 > 2 ?문자열 비교
= : 문자열이 같음!= : 문자열이 다름-z : 길이가 0인지-n : 길이가 0보다 큰지괄호 [ ] 안과 바깥의 공백, 연산자 앞뒤 공백을 반드시 지켜주는 것이 중요하다.
#!/bin/bash
# gt: greater than (보다 큰)
# lt: less than (보다 작은)
if [ 1 -gt 2 ]; then
echo "hello world"
else
echo "bye world"
fi
[ 1 -gt 2 ] 는 거짓이므로, 실제 출력은 bye world가 된다.Shell 스크립트에서 변수는 아래처럼 선언한다.
변수명=값 # = 양쪽에 공백 없음
사용할 때는 $변수명 형태로 참조한다.
file_name="first_file.txt"
echo "$file_name"
"${변수명}" 또는 "$변수명" 형태로 감싸서 사용하는 것이 안전하다.파일, 디렉터리 존재 여부는 -f, -d 와 같은 테스트 옵션으로 확인할 수 있다.
-f : 일반 파일이 존재하는지 확인-d : 디렉터리가 존재하는지 확인#!/bin/bash
file_name="first_file.txt"
if [ -f "$file_name" ]; then
echo "$file_name exists!"
else
echo "$file_name does not exist!"
fi
"first_file.txt" 라는 이름의 파일이 있으면 exists!, 없으면 does not exist!를 출력한다.-d "$dir_name" 을 사용할 수 있다.반복문에는 for ~ in ~ do ~ done 구조를 사용한다.
for 변수 in 항목들; do
# 반복해서 실행할 명령
done
항목들 자리에 올 수 있는 것들:
for x in a b cfor x in {1..10}for x in $(ls)for x in *.txt#!/bin/bash
# {1..100} : 1부터 100까지 시퀀스를 생성
for a in {1..100}; do
echo "hello world $a"
done
a가 1부터 100까지 바뀌면서, hello world 1, hello world 2 … 가 순차적으로 출력된다.#!/bin/bash
# * : 현재 디렉터리의 모든 항목 (숨김 파일 제외)
for a in *; do
echo "$a"
done
#!/bin/bash
count=100
# {1..100} : 1부터 100까지 반복
for a in {1..100}; do
# let 은 산술 연산용 내장 명령
# 다른 표기: count=$((count + 1))
let count=count+1
done
echo "count value is $count"
count=100 에서 시작해, 100번 반복하면서 1씩 증가시킨다.200이 된다.let, $(( ... )) 둘 다 정수 연산에 자주 사용되는 패턴이니 둘 다 익혀두면 좋다.터미널에서 매번 손으로 치던 명령들을 .sh 파일로 묶어 두기만 해도 작업의 수고가 크게 줄어들것같다는걸 느낀 실습이였다 굿
Shebang
뭔가 엄청난 이름이죠?
그녀가 터뜨린다
체인소맨 레제와 같다고 할 수 있겠습니다
저는 참고로 체인소맨을 정말좋아하는데요특히요시다라는문어의악마와계약한친구가있습니다이친구는등장때부터아주간지가나며문어의악마를다룬다는점에서크툴루신화를반영한다면정말강한데빌헌터라고할수있는데요최근화에서아주아쉽게(스포)되었습니다아주아쉽습니다…추모의시간을가집시다 모두묵념