🚀 94sssh
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 = str2str1과 str2가 같음
str1 != str2str1과 str2가 같지 않음
-n str1str1이 빈 문자열이 아님
-z str1str1이 빈 문자열임

정수 비교

연산자내용
int1 -eq int2int1과 int2가 같음
int1 -ne int2int1과 int2가 같지 않음
int1 -lt int2int1이 int2보다 작음
int1 -le int2int1이 int2 이하임
int1 -gt int2int1이 int2보다 큼
int1 -ge int2int1이 int2 이상임

파일 속성

연산자내용
-e filefile이 존재함
-d filefile이 존재하고 디렉터리임
-h filefile이 존재하고 심볼릭 링크임
-L filefile이 존재하며 심볼릭 링크임(h와 동일)
-f filefile이 존재하며, 일반 파일임
-r filefile이 존재하며, 읽기 권한이 부여되어 있음
-w filefile이 존재하며, 쓰기 권한이 부여되어 있음
-x filefile이 존재하며, 실행 권한이 부여되어 있음
file1 -nt file2file1의 변경 시각이 file2보다 최근임
file1 -ot file2file1의 변경 시각이 file2보다 오래됨

연산자 결합

연산자내용
조건식1 -a 조건식2AND
조건식1 -o 조건식2OR
! 조건식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 사용