로보테크AI

융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/10

steezer 2026. 3. 10. 18:30

프로세스 관리

 

CPU

프로그램의 명령어를 해석해 산술 연산, 논리 연산 등 모든 연산을 수행하는 컴퓨터의 두뇌

여러 CPU가 하나의 칩에 장착

프로세서: 여러 CPU로 된 하나의 칩

코어: 프로세성 장착된 CPU

멀티 코어 프로세서: 코어가 여러 개

 

레지스터

CPU 내부에 포함된 아주 작고 빠른 메모리

CPU가 연산을 수행할 떄 필요한 데이터를 임시로 저장

 

메모리

RAM, 프로그램 코드와 데이터를 저장하는 공간

CPU와 물리적으로 떨어져 시스템 버스 통로로 연결

휘발성 메모리: 저장된 데이터는 컴퓨터가 꺼지면 모두 사라짐

 

저장장치

HDD, SSD, 플레시 매모리 / 디스크

비휘발성 메모리: 저장 장치에 저장된 데이터는 컴퓨터의 전원이 꺼져도 보존

 

시스템 버스

컴퓨터 내부에서 데이터를 주고받는 통로

CPU, 메모리, 디스크 등 구성 요소가 데이터 주고 받을 때 버스 사용

주소 버스, 데이터 버스, 제어 버스 등 여러 종류

(프로그램을 작동시키면 디스크에 저장된 프로그램 실행코드를 시스템 버스를 통해 메모리로 적재

디스크에 저장된 프로그램 코드를 메모리에 복사)

 

프로세스

메모리에서 실행 중인 프로그램

 

 

프로그램

디스크에 저장된 실행 파일

 

 

프로세스 계층 구조

부모 프로세스: 프로세스를 생성한 프로세스

자식 프로세스: 부모 프로세스가 생성한 프로세스

 

init프로세스

모든 프로세스의 시조

리눅스 커널이 부팅하며 만든 최초의 프로세스

전통적으로 PID(프로세스 ID)에 1 부여

보통 초기화 프로세스로 sysyemd를 설정

 

프로세스 종료

자식 프로세스가 종료될 때까지 무한 대기

부모 프로세스가 다른 작업을 하다가 주기적으로 자식 프로세스가 종료 됐는지 확인

SIGCHLD 시그널을 수신했을 때 자식 프로세스를 종료 처리하는 방법

 

좀비 프로세스

프로세스가 종료됐지만 종료 처리를 하지 않아 프로세스가 완전히 정리되지 않은 상태

 

고아 프로세스

부모 프로세스가 자식 프로세스보다 먼저 종료된 경우 자식 프로세스가 가리킴

 

ps

현재 실행 중인 프로세스에 대한 정보를 보여줌

 

steezer@DESKTOP-TF8J569:~$ cd 260310
steezer@DESKTOP-TF8J569:~/260310$ ps
    PID TTY          TIME CMD
    465 pts/2    00:00:00 bash
   6869 pts/2    00:00:00 ps
steezer@DESKTOP-TF8J569:~/260310$ ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
steezer      465     464  0 09:02 pts/2    00:00:00 -bash
steezer     6871     465  0 09:51 pts/2    00:00:00 ps -f
steezer@DESKTOP-TF8J569:~/260310$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 09:01 ?        00:00:01 /lib/systemd/systemd --system --deserialize 41
root           2       1  0 09:01 ?        00:00:00 /init
root           8       2  0 09:01 ?        00:00:00 plan9 --control-socket 7 --log-level 4 --server-fd 8 -
root          95       1  0 09:01 ?        00:00:00 snapfuse /var/lib/snapd/snaps/core22_2339.snap /snap/c
root          96       1  0 09:01 ?        00:00:00 snapfuse /var/lib/snapd/snaps/asciiquarium_59.snap /sn
root          97       1  0 09:01 ?        00:00:01 snapfuse /var/lib/snapd/snaps/snapd_25935.snap /snap/s
root         199       1  0 09:01 ?        00:00:00 /usr/sbin/cron -f -P
message+     201       1  0 09:01 ?        00:00:00 @dbus-daemon --system --address=systemd: --nofork --no
root         206       1  0 09:01 ?        00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-st
root         209       1  0 09:01 ?        00:00:00 /usr/lib/snapd/snapd
root         210       1  0 09:01 ?        00:00:00 /lib/systemd/systemd-logind
root         215       1  0 09:01 hvc0     00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console
root         223       1  0 09:01 tty1     00:00:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root         241       1  0 09:01 ?        00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unatte
root         350       2  0 09:02 pts/1    00:00:00 /bin/login -f
steezer      393       1  0 09:02 ?        00:00:00 /lib/systemd/systemd --user
steezer      394     393  0 09:02 ?        00:00:00 (sd-pam)
steezer      407     350  0 09:02 pts/1    00:00:00 -bash
root         463       2  0 09:02 ?        00:00:00 /init
root         464     463  0 09:02 ?        00:00:00 /init
steezer      465     464  0 09:02 pts/2    00:00:00 -bash
root         630       1  0 09:48 ?        00:00:00 /usr/libexec/packagekitd
root         634       1  0 09:48 ?        00:00:00 /usr/libexec/polkitd --no-debug
systemd+    2052       1  0 09:49 ?        00:00:00 /lib/systemd/systemd-resolved
root        2054       1  0 09:49 ?        00:00:00 /lib/systemd/systemd-journald
systemd+    2111       1  0 09:49 ?        00:00:00 /lib/systemd/systemd-timesyncd
syslog      3936       1  0 09:50 ?        00:00:00 /usr/sbin/rsyslogd -n -iNONE
root        4173       1  0 09:50 ?        00:00:00 /lib/systemd/systemd-udevd
steezer     6872     465  0 09:52 pts/2    00:00:00 ps -ef
steezer@DESKTOP-TF8J569:~/260310$ ps -ef --forest
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 09:01 ?        00:00:01 /lib/systemd/systemd --system --deserialize 41
root           2       1  0 09:01 ?        00:00:00 /init
root           8       2  0 09:01 ?        00:00:00  \_ plan9 --control-socket 7 --log-level 4 --server-fd
root         350       2  0 09:02 pts/1    00:00:00  \_ /bin/login -f
steezer      407     350  0 09:02 pts/1    00:00:00  |   \_ -bash
root         463       2  0 09:02 ?        00:00:00  \_ /init
root         464     463  0 09:02 ?        00:00:00      \_ /init
steezer      465     464  0 09:02 pts/2    00:00:00          \_ -bash
steezer     6873     465  0 09:53 pts/2    00:00:00              \_ ps -ef --forest
root          95       1  0 09:01 ?        00:00:00 snapfuse /var/lib/snapd/snaps/core22_2339.snap /snap/c
root          96       1  0 09:01 ?        00:00:00 snapfuse /var/lib/snapd/snaps/asciiquarium_59.snap /sn
root          97       1  0 09:01 ?        00:00:01 snapfuse /var/lib/snapd/snaps/snapd_25935.snap /snap/s
root         199       1  0 09:01 ?        00:00:00 /usr/sbin/cron -f -P
message+     201       1  0 09:01 ?        00:00:00 @dbus-daemon --system --address=systemd: --nofork --no
root         206       1  0 09:01 ?        00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-st
root         209       1  0 09:01 ?        00:00:00 /usr/lib/snapd/snapd
root         210       1  0 09:01 ?        00:00:00 /lib/systemd/systemd-logind
root         215       1  0 09:01 hvc0     00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console
root         223       1  0 09:01 tty1     00:00:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root         241       1  0 09:01 ?        00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unatte
steezer      393       1  0 09:02 ?        00:00:00 /lib/systemd/systemd --user
steezer      394     393  0 09:02 ?        00:00:00  \_ (sd-pam)
root         630       1  0 09:48 ?        00:00:00 /usr/libexec/packagekitd
root         634       1  0 09:48 ?        00:00:00 /usr/libexec/polkitd --no-debug
systemd+    2052       1  0 09:49 ?        00:00:00 /lib/systemd/systemd-resolved
root        2054       1  0 09:49 ?        00:00:00 /lib/systemd/systemd-journald
systemd+    2111       1  0 09:49 ?        00:00:00 /lib/systemd/systemd-timesyncd
syslog      3936       1  0 09:50 ?        00:00:00 /usr/sbin/rsyslogd -n -iNONE
root        4173       1  0 09:50 ?        00:00:00 /lib/systemd/systemd-udevd

 

프로세스 생성과 종료

kill [옵션] PID

killall [옵션] 프로세스_이름

sleep 시간

steezer     6875     465  0 09:55 pts/2    00:00:00 sleep 300

steezer@DESKTOP-TF8J569:~$ ps -ef | grep sleep
steezer     6875     465  0 09:55 pts/2    00:00:00 sleep 300
steezer     6898    6878  0 09:55 pts/0    00:00:00 grep --color=auto sleep
steezer@DESKTOP-TF8J569:~$ kill 6875

 

steezer@DESKTOP-TF8J569:~$ ps -ef | grep sleep
steezer     6903     465  0 09:58 pts/2    00:00:00 sleep 300
steezer     6905    6878  0 09:58 pts/0    00:00:00 grep --color=auto sleep
steezer@DESKTOP-TF8J569:~$ kill -KILL 6903

steezer@DESKTOP-TF8J569:~/260310$ sleep 300
Killed
steezer@DESKTOP-TF8J569:~$ killall -TERM sleep

steezer@DESKTOP-TF8J569:~/260310$ sleep 300
Terminated

 

프로세스의 작동

 

생애주기

현실과 비교

현실 : 시스템

지구 : 운영체제

생물 종류: 프로그램 종류

생명 탄생: 프로세스 생성

생명 죽음 : 프로세스의 소멸

 

멀티 태스킹을 위한 여러 기법

프로세스 스케줄링: 여러프로세스 중 CPU가 처리할 프로세스를 결정하는 행위

ㄴ이를 담당하는 주체가 프로세스 스케줄러

 

스케줄링 알고리즘: 프로세스 스케줄러가 처리할 프로세스를 선택하는 방법

ㄴ공평성, 우선순위, 효율성, 응답 시간

 

컨텍스트 스위칭: 프로세스 스케줄링에 따라 처리되는 프로세스가 변경되는 일련의 과정

ㄴ현재 프로세스 상태 저장(프로세스 제어블록에)->다음 프로세스 선택과 실행

ㄴ컨텍스트 스위칭 오버헤드(메모리 공간을 추가 사용, 시간도 소모)

ㄴ발생시키는 이벤트:인터럽트, 시스템 콜, 시그널, 예외

 

프로세스 상태

실행/실행 대기 상태

중단 상태

종료 상태

수면 상태

(깨어날 수 있는 수면 상태, 깨어나지 않는 수면 상태)

 

프로세스 종료 상태

0~255 사이 종료 코드와 프로세스가 종료될 때 받은 시그널 정보로 구성

종료 코드: 0 성공, 이외 실패

시그널 정보: 비정상 종료의 경우를 위한 정보

 

스레드: 프로세스의 가장 작은 실행 단위

싱글  스레드 프로세스, 멀티 스레드 프로세스 존재

 

파일 디스크립터:프로세스별 파일 관리

표준 스트림 또는 표준 입출력: 프로세스가 생성되면 기본적으로 열게 되는 파일들

ㄴ(스트림: 표준 입력, 표준 출력, 표준 에러)

 

포어그라운드 프로세스: 사용자와 상호작용이 필요

백그라운드 프로세스: 사용자와 상호작용이 필요 X

 

ping 명령어: 네트워크 연결상태 확인

ㄴICMP의 에코 요청 패킷을 대상 호스트로 보냄

ICMP: 네트워크 장치에서 네트워크 통신 문제를 진단하는 데 사용하는 프로토콜

 

jobs [옵션] [작업] / 시스템 관리자나 사용자가 현재 셀 세션에서 실행되는 작업을 관리하는 데 사용

ㄴ여러 작업 동시에 실행, 백그라운드 작업 관리에 효과적

 

steezer@DESKTOP-TF8J569:~/260310$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=28.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=28.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=28.7 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=29.0 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 28.159/28.676/28.972/0.316 ms
steezer@DESKTOP-TF8J569:~/260310$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=28.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=29.2 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=28.4 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 28.368/28.683/29.193/0.363 ms
steezer@DESKTOP-TF8J569:~/260310$ ping -c 3 8.8.8.8 &
[1] 6949
steezer@DESKTOP-TF8J569:~/260310$ PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=28.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=29.0 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=29.0 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 28.840/28.951/29.017/0.079 ms
^C
[1]+  Done                    ping -c 3 8.8.8.8
steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 10 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^Z
[1]+  Stopped                 ping -q -c 10 8.8.8.8
steezer@DESKTOP-TF8J569:~/260310$ bg
[1]+ ping -q -c 10 8.8.8.8 &
steezer@DESKTOP-TF8J569:~/260310$
--- 8.8.8.8 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 17160ms
rtt min/avg/max/mdev = 27.888/28.871/29.402/0.508 ms

[1]+  Done                    ping -q -c 10 8.8.8.8
steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 10 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^Z
[1]+  Stopped                 ping -q -c 10 8.8.8.8
steezer@DESKTOP-TF8J569:~/260310$ fg
ping -q -c 10 8.8.8.8
^C
--- 8.8.8.8 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 12332ms
rtt min/avg/max/mdev = 28.516/28.819/29.170/0.237 ms
steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 600 8.8.8.8 &
[1] 6957
steezer@DESKTOP-TF8J569:~/260310$ PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 600 www.google.com &
[2] 6958
steezer@DESKTOP-TF8J569:~/260310$ PING www.google.com (172.217.213.147) 56(84) bytes of data.

steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 600 www.wikipedia.org &
[3] 6959
steezer@DESKTOP-TF8J569:~/260310$ PING dyna.wikimedia.org (103.102.166.224) 56(84) bytes of data.

steezer@DESKTOP-TF8J569:~/260310$ jobs
[1]   Running                 ping -q -c 600 8.8.8.8 &
[2]-  Running                 ping -q -c 600 www.google.com &
[3]+  Running                 ping -q -c 600 www.wikipedia.org &
steezer@DESKTOP-TF8J569:~/260310$ jobs -l
[1]   6957 Running                 ping -q -c 600 8.8.8.8 &
[2]-  6958 Running                 ping -q -c 600 www.google.com &
[3]+  6959 Running                 ping -q -c 600 www.wikipedia.org &
steezer@DESKTOP-TF8J569:~/260310$

 

IPC

프로세스 간 통신

 

파이프

두 프로세스 간 데이터 전송할 때 사용하는 IPC

ㄴ명명된 파이프: 파이프에 파일 형식의 이름 부여

 

메시지 큐

정해진 큐에 메시지를 넣고 빼는 방식(선입 선출)

 

소켓

네트워크로 연결된 다른 시스템에서 작동하는 프로세스와 통신할 때 사용

ㄴ인터넷 소켓, 유닉스 도메인 소켓

 

공유 메모리

데이터를 보내고 받는 것이 아닌 데이터 자체를 공유하는 개념

ㄴ사용할 때 반드시 동기화 고려

 

세마포어

임계 영역을 보호하기 위한 수단

공유 메모리에서 프로세스의 동시 접근을 제한하거나 프로세스의 순서를 조절할 때 사용

ㄴ카운팅 세마포어(어떤 자원을 n개 프로세스만 사용할 수 있게 할 때)

ㄴ바이너리 세마포어, 뮤텍스: 자원을 독점적으로 사용할 수 있도록 세마포어 초기 설정 값을 1로 설정하는 세마포어

 

시그널

POSIX에서 정의한 IIPC 도구

프로세스에 어떤 이벤트가 발생했음을 알려주기 위해 사용

 

시그널 송수신

ㄴ시그널은 커널이 프로세스에 보내기도 하고, 프로세스가 다른 프로세스에 보내기도 함, 프로세스가 자기 자신에게 시그널을 보낼 수도 있음

ㄴ 소켓과 같이 데이터 교환을 주 목적으로 하는 IPC와 달리 시그널은 중복 시그널 처리할 수 없음, 프로세스가 한 시그널을 수신하고 해당 시그널을 처리하기 전에 같은 종류의 시그널을 수신한다면 두 번째 도착한 시그널은 무시 됨

 

시그널 종류

SIGABRT 의도적인 중단
SIGALRM 정해진 시간이 됨
SIGBUS 하드웨어 버스 에러
SIGCHLD 자식 프로세스 종료
SIGSTOP 프로세스 중단
SIGCONT 중단된 프로세스 재개
SIGHUP 프로세스의 제어 터미널이 닫힘
SIGINT 사용자가 인터럽트 생성(Ctrl+C)
SIGQUIT 사용자가 종료 문자 생성(Ctrl+\)
SIGTSTP 사용자가 일시 중지 문자 생성(Ctrl+Z)
SIGPIPE 프로세스가 잘못된 파이프에 쓰기 시도
SIGSEGV 허용되지 않은 메모리 영역에 접근할 때 발생
SIGKILL 프로세스 종료 명령
SIGTERM 프로세스 종료 명령(조건에 따른 처리 가능)
SIGUSR1 사용자 정의 시그널 1
SIGUSR2 사용자 정의 시그널 2

 

시그널 처리 방법

프로세스가 시그널을 수신하면 프로세스는 수신한 시그널을 처리해야 함

프로그램은 시그널별로 어떻게 처리할지 프로그램 코드 수준에서 정의할 수 있음

특정 시그널을 수신했을 때 무시하거나 원하는 일을 정의한 시그널 핸들러를 지정할 수도 있음

시그널 핸들러가 지정되지 않은 시그널은 시그널의 기본 처리 방법대로 동작함

프로세스를 종료시키거나 중지/재개시킬 수 있고, 코어 덤프 파일을 남기며 프로세스 종료할 수도 있음

 

steezer@DESKTOP-TF8J569:~$ ps -ef | grep ping
steezer     7944    7916  0 12:26 pts/0    00:00:00 ping 8.8.8.8
steezer     7965    7951  0 12:26 pts/2    00:00:00 grep --color=auto ping
steezer@DESKTOP-TF8J569:~$ kill -TERM 7944
steezer@DESKTOP-TF8J569:~$ ps -ef | grep ping
steezer     7966    7916  0 12:27 pts/0    00:00:00 ping 8.8.8.8
steezer     7968    7951  0 12:27 pts/2    00:00:00 grep --color=auto ping
steezer@DESKTOP-TF8J569:~$ kill -SIGINT 7966
steezer@DESKTOP-TF8J569:~$ ps -ef | grep ping
steezer     7969    7916  0 12:27 pts/0    00:00:00 ping 8.8.8.8
steezer     7971    7951  0 12:27 pts/2    00:00:00 grep --color=auto ping
steezer@DESKTOP-TF8J569:~$ kill -SIGSTOP 7969
steezer@DESKTOP-TF8J569:~$ kill -SIGCONT 7969
steezer@DESKTOP-TF8J569:~$ kill -SIGSTOP 7969
steezer@DESKTOP-TF8J569:~$ ps -ef | grep ping
steezer     7969    7916  0 12:27 pts/0    00:00:00 ping 8.8.8.8
steezer     8012    7916  0 12:31 pts/0    00:00:00 ping 8.8.8.8
steezer     8013    7999  0 12:31 pts/3    00:00:00 ping 8.8.4.4
steezer     8015    7951  0 12:31 pts/2    00:00:00 grep --color=auto ping
steezer@DESKTOP-TF8J569:~$ killall -TERM -v ping
Killed ping(7969) with signal 15
Killed ping(8012) with signal 15
Killed ping(8013) with signal 15
steezer@DESKTOP-TF8J569:~$

 

PID가 12345인 프로세스에 SIGINT 시그널을 보내려할 때 해당하는 명령어

kill -SIGINT 12345

 

ping 프로세스 여러 개가 동작 중인 상황에서 명령 하나로 ping 프로세스 모두 종료시키려할 때 해당하는 명령어

killall ping

 

변수

변수_이름 = 값

steezer@DESKTOP-TF8J569:~/260310$ cd ..
steezer@DESKTOP-TF8J569:~$ mkdir script
steezer@DESKTOP-TF8J569:~$ cd script
steezer@DESKTOP-TF8J569:~/script$ VAR="value"
steezer@DESKTOP-TF8J569:~/script$ echo ${VAR}
value
steezer@DESKTOP-TF8J569:~/script$ world="Banana"
steezer@DESKTOP-TF8J569:~/script$ echo $worldIsMine

steezer@DESKTOP-TF8J569:~/script$ echo ${world}IsMine
BananaIsMine
steezer@DESKTOP-TF8J569:~$ a=1
steezer@DESKTOP-TF8J569:~$ echo $a
1
steezer@DESKTOP-TF8J569:~$ b=$a+1
steezer@DESKTOP-TF8J569:~$ echo $b
1+1
steezer@DESKTOP-TF8J569:~$ b=${a}+1
steezer@DESKTOP-TF8J569:~$ echo $b
1+1

 

let "표현식"

steezer@DESKTOP-TF8J569:~$ a=1
steezer@DESKTOP-TF8J569:~$ let "b = a + 1"
steezer@DESKTOP-TF8J569:~$ echo $b
2
steezer@DESKTOP-TF8J569:~$ let "b = b * 2"
steezer@DESKTOP-TF8J569:~$ echo $b
4

 

expr 표현식

steezer@DESKTOP-TF8J569:~/script$ a=8
steezer@DESKTOP-TF8J569:~/script$ b=2
steezer@DESKTOP-TF8J569:~/script$ expr $a + $b
10
steezer@DESKTOP-TF8J569:~/script$ expr $a - $b
6
steezer@DESKTOP-TF8J569:~/script$ expr $a / $b
4
steezer@DESKTOP-TF8J569:~/script$ expr $a \* $b
16
steezer@DESKTOP-TF8J569:~/script$ expr $a + $b
10
steezer@DESKTOP-TF8J569:~/script$ result=$(expr $a + $b)
steezer@DESKTOP-TF8J569:~/script$ echo $result
10

 

조건문

 

  if문

 

if 조건

then

    명령

fi

 

※들여쓰기 == 인덴테이션, 인덴트, 중요 X 가독성을 위할 뿐

 

if 조건

then

    명령1

else

    명령2

fi

 

조건문 중첩 지원 O

if 조건1

then

    명령1

else

    if 조건2

    then

        명령2

    else

        명령3

    fi

fi

 

조건 끝에 세미콜론 표시

if 조건;then

    명령

fi

 

if 조건; then

    명령1

else

    명령2

fi

 

if 조건1; then

    명령1

elif 조건2; then

    명령2

else

    명령3

fi

 

steezer@DESKTOP-TF8J569:~$ if ls
> then
>     echo "Result is success"
> else
>     echo "Result is fail"
> fi
260309  260310  greetings  normal_file  script  snap
Result is success

 

steezer@DESKTOP-TF8J569:~$ ls asdf
ls: cannot access 'asdf': No such file or directory
steezer@DESKTOP-TF8J569:~$ echo $?
2

 

steezer@DESKTOP-TF8J569:~$ if ls asdf
> then
>     echo "Result is success"
> else
>     echo "Result is fail"
> fi
ls: cannot access 'asdf': No such file or directory
Result is fail

 

[명령어

if문에서 가장 많이 사용하는 명령어

steezer@DESKTOP-TF8J569:~$ ls -al /usr/bin | head
total 108076
drwxr-xr-x  2 root root       36864 Mar 10 12:01 .
drwxr-xr-x 14 root root        4096 Jan  7  2025 ..
-rwxr-xr-x  1 root root       18456 Feb  8  2021 411toppm
-rwxr-xr-x  1 root root       31104 Jan 28  2022 JxrDecApp
-rwxr-xr-x  1 root root       32536 Jan 28  2022 JxrEncApp
lrwxrwxrwx  1 root root           4 Feb 17  2020 NF -> col1
lrwxrwxrwx  1 root root           1 Mar 25  2022 X11 -> .
-rwxr-xr-x  1 root root       51648 Feb  8  2024 [
-rwxr-xr-x  1 root root       35344 Mar  7  2024 aa-enabled

 

if [ 표현식 ]; then

fi

 

if [[ 표현식 ]]; then

fi

 

문자열 테스트 연산자

=, ==, !=, >, <, -n, -z

 

#!/bin/bash

A="hello"
B="world"

if [ "$A" == "$B" ]; then
    echo "== operator: True"
else
    echo "== operator: False"
fi

if [ "$A" != "$B" ]; then
    echo "!= operator: True"
else
    echo "!= operator: False"
fi

if [ "$A" \> "$B" ]; then
    echo "> operator: True"
else
    echo "> operator: False"
fi

if [ -n "$A"  ]; then
    echo "-n operator: True"
else
    echo "-n operator: False"
fi

if [ -z "$A" ]; then
    echo "-z operator: True"
else
    echo "-z operator: False"
fi

 

steezer@DESKTOP-TF8J569:~/script$ chmod +x string.sh
steezer@DESKTOP-TF8J569:~/script$ ./string.sh
== operator: False
!= operator: True
> operator: False
-n operator: True
-z operator: False

 

steezer@DESKTOP-TF8J569:~/script$ chmod +x filetest.sh
steezer@DESKTOP-TF8J569:~/script$ ./filetest.sh
target file is string.sh
-f operator: True
-r operator: True
-d operator: False
-s operator: True
target file is /etc/passwd
-r operator: True
-w operator: False
-x operator: False

 

변수

변수는 데이터를 담는 그릇으로, Bash는 변수에 문자열 형식으로 값을 저장

변수에 저장된 값을 사용할 때는 변수 이름을 ${}로 감싸서 사용

 

조건문
조건문은 주어진 조건이 참인지 거짓인지에 따라 다른 명령을 수행할 수 있음


if 문의 조건 부분이 참(True)인 경우에만 then 이후 명령 부분을 실행

조건으로 일반 명령을 사용할 수 있는데, 명령의 성공/실패에 따라 if 문의 참/거짓이 결정

if 문에 else가 포함돼 있으면 then 이후 명령 부분은 조건이 참인 경우에만 실행되고, else 이후 명령 부분은 조건이 거짓인 경우에만 실행

if 문의 else 부분에 if 문이 중첩되면 elif 키워드를 사용해 한 문장으로 만들 수 있음

 

if 조건1; then
    명령1
elif 조건2; then
    명령2
else
    명령3
fi

 

[ 명령어
조건문에서 다양한 조건 판단을 할 때는 [ 명령어(싱글 브래킷)을 사용

[ 명령어에서는 다음과 같은 연산자를 사용 가능

구분 연산자 설명
문자열 테스트 연산자 = 또는 == 두 문자열이 같으면 참
!= 두 문자열이 다르면 참
> 또는 < 두 문자열을 사전식으로 비교
-n 문자열의 길이가 0이 아니면 참
-z 문자열의 길이가 0이면 참
문자열에 값이 설정돼 있지 않거나 빈 문자열(empty string)인 경우 문자열의 길이를 0으로 판단
산술 테스트 연산자 -eq equal의 약자로, 연산자 좌우의 값이 같으면 참을 반환
-ne not equal의 약자로, 연산자 좌우의 값이 다르면 참을 반환
-le less than or equal의 약자로, 연산자 좌측 값이 우측 값보다 작거나 같으면 참을 반환
-lt less than의 약자로, 연산자 좌측 값이 우측 값보다 작으면 참을 반환
-gt greater than의 약자로, 연산자 좌측 값이 우측 값보다 크면 참을 반환
-ge greater than or equal의 약자로, 연산자 좌측 값이 우측 값보다 크거나 같으면 참을 반환
파일 테스트 연산자 -e 파일이 존재하면 참을 반환
-f 파일이 일반 파일이면 참을 반환
-d 파일이 디렉터리면 참을 반환
-s 파일이 비어 있지 않으면(크기가 0이 아니면) 참을 반환
-L 파일이 심볼릭 링크면 참을 반환
-r 파일에 읽기 권한이 있으면 참을 반환
-w 파일에 쓰기 권한이 있으면 참을 반환
-x 파일에 실행 권한이 있으면 참을 반환
논리 테스트 연산자 -a AND 연산
-o OR 연산
! NOT 연산

 

더블 브래킷은 문자가 다른 의미로 해석되는 것을 막기 때문에 *나 부등호에 백슬래시를 붙일 필요 없음

정규 표현식 사용 가능

 

산술 연산을 위해 이중 괄호 연산을 사용할 수 있음

 

 

반복문

for 문은 셸 스크립트에서 사용하는 반복문 중 하나

반복문에서 반복되는 구문을 루프(loop)라고 함

for 문으로 만들어진 루프는 주어진 목록이나 범위에서 명령을 반복해서 실행

for 문은 파일 목록이나 문자열 목록, 산술적 범위 등을 순회할 때 유용

각 반복(iteration)에서는 목록이나 범위의 항목을 변수에 할당하고 해당 변수로 명령을 실행함

 

for 변수 in 목록
do
    명령
done

 

for 변수 in 목록; do 명령; done

 

목록 부분에는 반복하고 싶은 항목들의 목록을 지정

변수 부분에는 매 반복에서 목록 부분에 지정한 항목을 저장할 변수의 이름을 넣음

이렇게 하면 반복이 일어날 때마다 변수에 지정한 항목이 하나씩 값으로 저장

 

C 언어의 for 문과 유사한 형식으로 작성 가능

for ((초기식; 조건식; 증감식))
do
    명령
done

 

C 언어 스타일의 for 문은 이중 괄호 표현식을 사용

이중 괄호 안에는 세미콜론으로 구분한 초기식, 조건식, 증감식이 있음

초기식 for 문을 시작하면서 한 번만 실행되는 표현식

조건식 for 문을 언제까지 반복할지 판단하는 표현식

for 문은 조건식을 만족하는 동안 반복

증감식 for 문을 반복할 때마다 실행할 표현식

주로 반복이 일어날 때마다 어떤 값을 변경하고, 변경된 정보를 명령 부분에서 사용

 

초기식, 조건식, 증감식 모두 산술 표현식으로 작성

 

산술 표현식

산술 연산자가 포함된 연산식

 

 

while 문
조건이 참인 동안 명령을 반복해서 실행하는 반복문

주어진 조건이 거짓이 될 때까지 루프 안 명령을 계속 실행

for 문과 같은 초기식과 증감식이 없음

루프 안 명령에서 조건의 판단 결과가 변경돼야 함

 

while 조건식
do
    명령
done

 

while 조건식; do 명령; done

 

 

until 

조건이 거짓인 동안 명령을 반복해서 실행하는 반복문

while 문과 비슷하지만, 반복을 종료하는 기준이 반대

while 문은 조건식이 참인 동안 반복 실행하지만, until 문은 조건식이 거짓인 동안 반복

until 문은 조건식이 참이 되면 반복을 종료

 

until 조건식
do
    명령
done

 

until 조건식; do 명령; done

 

 

break continue

for 문, while 문, until 문과 같은 반복문에서 제어 흐름을 변경하는 명령어

break는 반복문의 실행을 즉시 중단하고 반복문 밖으로 빠져나가는 데 사용

일반적으로 break는 조건문을 이용해 특정 조건을 만족할 때 반복을 강제로 종료

break는 무한히 반복되는 것을 방지하거나 필요한 데이터를 찾은 후 더 이상 반복 실행할 필요가 없을 때 유용함

break는 가장 내부 반복문을 종료하며, 선택적으로 숫자 인자(n)를 통해 중단할 외부 반복문의 레벨을 지정할 수 있음

 

break [n]

 

continue는 반복문에서 현재 반복을 중단하고 다음 반복으로 넘어갈 때 사용

continue를 만나면 루프에서 나머지 부분을 건너뛰고 다음 반복을 시작

continue는 반복문에서 조건을 만족하는 경우에만 특정 부분을 실행하거나 목록의 어떤 항목을 건너뛰고 싶을 때 유용함

continue는 가장 내부 반복문에 영향을 미치며, 선택적으로 숫자 인자(n)를 통해 영향을 미칠 외부 반복문의 레벨을 지정할 수 있음

 

continue [n]