- Published on
2025.10.29
[모두의 리눅스] - 16. 셸 스크립트의 기초 지식
16.1. 셸 스크립트의 기본
셸 스크립트에 입력할 때 여러 명령어를 ; 로 연결해 한 행으로 입력할 수 있다.
echo "root directory";cd /;ls -l
커맨드 라인이 길어지면 행 끝에 \를 입력해 여러 행에 걸쳐 입력할 수 있다.
echo \
"root directory"
셸을 사용할 때도 ''로 커맨드 라인을 여러 행에 나눠 입력할 수 있다.
입력 후 엔터를 누르면 프롬프트가 >로 변하는데, 이를 세컨더리 프롬프트라 한다.
$ echo \
>
파이프라인을 사용할 때 | 뒤에서 줄바꿈을 해 여러 행에 걸쳐 입력할 수 있다.
sort file3 |
uniq -c |
sort -n
# 셸 스크립트에서는 #로 주석을 사용
16.2. 변수
PS1도, 환경 변수도 모두 셸 변수다. PS1='[\u] \w $'와 같이 변수명=값 방식으로 셸 변수에 값을 대입한다.
변수 주의점
- 변숫값을 참조할 때는 변수명 앞에 $를 붙인다.
- 변수에 값을 대입할 때는 $를 붙이지 않는다.
=양옆에 공백이 없어야 한다.- 변수명에는 알파벳, 숫자,
_만 사용할 수 있고, 숫자는 첫 글자로 사용할 수 없다. - 변숫값에 문자열을 연결할 때, 변수명을
{}로 감싸 문자열과 구분한다.
16.3. 쿼팅
배시는 공백을 기준으로 명령어의 인자를 구분하는데, my file처럼 공백을 포함하는 문자열을 하나의 인자로 지정할 때는 따옴표로 감싼다.
$ cat file1 file2 # file1과 file2 두 개의 인자
$ cat 'my file' # my file 이라는 하나의 인자
쿼팅할 때 작은따옴표와 큰따옴표의 방식에는 차이가 있다.
작은따옴표 안의 $는 일반 문자로, 큰따옴표 안의 $는 변수가 값으로 치환된다.
fruit=apple
echo 'I like $fruit' # I like $fruit / 일반 문자 취급
echo "I like $fruit" # I like apple / 값으로 치환됨
echo "I like \$fruit" # I like $fruit / 큰 따옴표도 \를 붙이면 문자 그대로 출력
16.4. 명령어 치환
명령어 치환은 $() 같은 형식으로 괄호에 명령어를 작성한다.
백쿼트(`)를 써도 동일하게 동작한다.
16.5. 위치 파라미터
셸 스크립트 실행 시 인자가 할당되는 변수, 와일드카드(*)를 지정하면 확장한 값이 전달
$ ./parameters.sh aaa bbb ccc
$0 = ./parameters.sh
$1 = aaa
$2 = bbb
$3 = ccc
$4 =
$5 =
| 변수 | 내용 |
|---|---|
| $0 | 셸 스크립트 파일 이름 |
| $1, $2,... | 위치 파라미터 |
| $# | 위치 파라미터의 개수 |
| $@ | 모든 위치 파라미터. 큰따옴표로 감싸면 각각의 위치 파라미터가 큰따옴표로 감싸짐 |
| $* | 모든 위치 파라미터. 큰따옴표로 감싸면 전체가 하나의 문자열로 감싸짐 |
대부분의 경우 $@를 많이 사용, $*는 잘 사용되지 않음.
16.6. 제어 구조
조건 분기, 반복 처리 등으로 복합 명령어인 if, for, case, while 등이 있음
if 문
if <명령어 1>; then
<명령어 1>의 결과가 참일 때 실행될 처리
elif <명령어 2>; then
<명령어 2>의 결과가 참일 때 실행될 처리
else
위 모든 명령어의 결과가 거짓일 때 실행될 처리
fi
조건식에 이어 세미콜론을 붙여야 하며, then을 다음 행에 쓴다며 생략할 수 있음.
if 뒤에 오는 것은 조건식이 아니라 명령어로, [ 자체가 명령어이다. [ ] 의 전후에 공백이 있어야 하고, [ 뒤에 오는 내용은 전부 인자로 전달됨.
명령어의 종료 상태
ls나 grep 등 모든 명령어는 종료 상태라는 정숫값을 반환, 정상 종료는 0, 에러가 발생하면 0 이외의 값을 반환.[ 명령어는 조건식이 참이면 0, 그 외는 0이 아닌 종료 상태를 반환함.
일부 명령어는 종료 상태만 필요한 경우, -q 옵션을 사용할 수 있음.
문자열 비교
| 연산자 | 내용 |
|---|---|
| str1 = str2 | str1과 str2가 같음 |
| str1 != str2 | str1과 str2가 같지 않음 |
| -n str1 | str1이 빈 문자열이 아님 |
| -z str1 | str1이 빈 문자열임 |
정수 비교
| 연산자 | 내용 |
|---|---|
| int1 -eq int2 | int1과 int2가 같음 |
| int1 -ne int2 | int1과 int2가 같지 않음 |
| int1 -lt int2 | int1이 int2보다 작음 |
| int1 -le int2 | int1이 int2 이하임 |
| int1 -gt int2 | int1이 int2보다 큼 |
| int1 -ge int2 | int1이 int2 이상임 |
파일 속성
| 연산자 | 내용 |
|---|---|
| -e file | file이 존재함 |
| -d file | file이 존재하고 디렉터리임 |
| -h file | file이 존재하고 심볼릭 링크임 |
| -L file | file이 존재하며 심볼릭 링크임(h와 동일) |
| -f file | file이 존재하며, 일반 파일임 |
| -r file | file이 존재하며, 읽기 권한이 부여되어 있음 |
| -w file | file이 존재하며, 쓰기 권한이 부여되어 있음 |
| -x file | file이 존재하며, 실행 권한이 부여되어 있음 |
| file1 -nt file2 | file1의 변경 시각이 file2보다 최근임 |
| file1 -ot file2 | file1의 변경 시각이 file2보다 오래됨 |
연산자 결합
| 연산자 | 내용 |
|---|---|
| 조건식1 -a 조건식2 | AND |
| 조건식1 -o 조건식2 | OR |
| ! 조건식 | NOT |
| () | 조건식을 그룹화 |
&&와 ||의 순차 평가도 있음
- 셸 스크립트의 종료 상태
미지정시 마지막으로 실행한 명령어의 종료 상태가 셸 스크립트의 종료 상태가 되며,exit로 명시적으로 종료 상태 지정 가능
for 문
for 변수 in 리스트
do
반복 처리
done
for 문의 리스트에 $@를 지정해 모든 인자에 동일한 처리 수행 가능(=전체 반복)하며, in <파일>을 생략하면 자동으로 $@가 리스트로 지정됨.
case 문
case 문의 마지막은 case를 거꾸로한 esac로 끝
case <문자열> in
<패턴 1>)
처리 1
;;
<패턴 2>)
처리 2
;;
...
esac
while 문
while <명령어>
do
반복 처리
done
16.7. 셸 함수
# 모두 동일하게 동작
function <함수 이름> ()
{
처리
}
function <함수 이름> # 괄호 생략
{
처리
}
<함수 이름> () { # function 생략
처리
}
셸 함수의 종료 상태는 마지막으로 실행한 명령어의 종료 상태로, 명시적으로 반환하려면 return 사용