Shell Script

Shell Script 기초(6)

사실 나도 모름 2023. 11. 27. 03:51
  1. exit
  2. test
  3. if ~ then
  4. case
  5. 과제

 


1. exit

exit 명령어는 쉘 스크립트나 쉘 세션을 종료하는 데 사용된다.

이 명령어는 스크립트나 쉘에서 실행 중인 프로세스를 종료하고 해당 프로세스의 상태 코드를 반환한다.
일반적으로 exit 명령어는 특정 조건이나 성공적인 실행 후에 스크립트를 종료하는 데 사용된다.

exit 명령어 뒤에는 종료 상태 코드(exit status)를 지정할 수 있다.

일반적으로 0은 성공을 나타내며, 1 이상의 값은 실패를 나타낸다.

  • $? : 앞에서 실행한 명령의 종료 코드값이 저장
종료 코드
0 성공 (Success)
1 일반적인 오류 (General Error)
2 잘못된 셸 명령 (Misuse of Shell Builtins)
126 실행 권한이 없음 (Permission problem or command is not an executable)
127 명령을 찾을 수 없음 (Command not found)
128+N 사용자가 프로세스를 종료함 (Exit value + 시그널 번호)
130 사용자에 의한 프로세스 강제 종료 (Ctrl+C로 인한 종료)
255 에러 발생 또는 종료 코드가 유효하지 않음

 

종료코드 130의 경우는 kill -l 명령어 입력하면 이유를 알 수 있다.

# 신호 중단에 대한 값
kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

 

Ctrl + C 는 실행되는 명령을 중단하는 것이므로 2번 SIGINT에 해당한다.

그래서 128 + 2를 하여 130이라는 코드가 도출되는 것이다.

 

 

 


2. test

test 명령은 주어진 조건이 참인지 거짓인지를 검사하는 데 사용된다.

명령어 실행결과를 true(0) 또는 false(1)로 리턴한다.

test는 대괄호 [ ]로도 표현될 수 있다.

실제로 [ ]는 내부적으로 test 명령을 호출하는 단축 표기법이다.

 

사용방법 : test 명령어 or [ 명령어 ]

 

test 명령어는 다양한 연산자를 지원한다.

연산자 설명
x -eq y x값과 y값이 같으면 true를 리턴
x -gt y x값이 y값보다 크면 true를 리턴
x -ge y x값이 y값보다 크거나 같으면 true를 리턴
x -lt y x값이 y값보다 작으면 true를 리턴
x -le y x값이 y값보다 작거나 같으면 true를 리턴
x -ne y x값과 y값이 같지 않으면 true를 리턴
-e file 파일이 존재하면 true를 리턴
-d file 파일이 디렉토리면 true를 리턴
-f file 파일이 일반 파일이면 true를 리턴
-x file 파일이 실행가능한 파일이면 true를 리턴

 

자세한 내용은 help test 명령을 입력하면 더 확인할 수 있다.

아래는 help test 명령을 한글로 번역한 것이다.

# help test 한글 번역
help test
`test` 명령(또는 `[ ]` 표기법)은 주어진 조건을 평가하는 데 사용됩니다. 조건이 참이면 종료 코드가 0이 되고, 거짓이면 종료 코드가 1이 됩니다. 단항 또는 이항 표현식을 사용하여 파일의 상태를 확인하거나 문자열 및 숫자 비교 연산을 수행할 수 있습니다. 아래는 `test` 명령의 주요 기능과 특징입니다:

**파일 연산자:**

- `-a FILE`: 파일이 존재하면 참.
- `-b FILE`: 파일이 블록 특수 파일이면 참.
- `-c FILE`: 파일이 문자 특수 파일이면 참.
- `-d FILE`: 파일이 디렉터리이면 참.
- `-e FILE`: 파일이 존재하면 참.
- `-f FILE`: 파일이 일반 파일(정규 파일)이면 참.
- `-g FILE`: 파일이 set-group-id이면 참.
- `-h FILE`: 파일이 심볼릭 링크이면 참.
- `-k FILE`: 파일이 스티키 비트가 설정되어 있으면 참.
- `-p FILE`: 파일이 명명된 파이프이면 참.
- `-r FILE`: 파일이 읽기 가능하면 참.
- `-s FILE`: 파일이 비어 있지 않으면 참.
- `-S FILE`: 파일이 소켓이면 참.
- `-t FD`: 파일 디스크립터 FD가 터미널에 열려 있으면 참.
- `-u FILE`: 파일이 set-user-id이면 참.
- `-w FILE`: 파일이 쓰기 가능하면 참.
- `-x FILE`: 파일이 실행 가능하면 참.
- `-O FILE`: 파일이 효과적으로 사용자 소유인 경우 참.
- `-G FILE`: 파일이 효과적으로 그룹 소유인 경우 참.
- `-N FILE`: 파일이 마지막으로 읽혔을 때 수정되었으면 참.
- `FILE1 -nt FILE2`: 파일1이 파일2보다 최신이면 참.
- `FILE1 -ot FILE2`: 파일1이 파일2보다 오래되었으면 참.
- `FILE1 -ef FILE2`: 파일1이 파일2에 대한 하드 링크이면 참.

**문자열 연산자:**

- `-z STRING`: 문자열이 비어 있으면 참.
- `-n STRING`: 문자열이 비어 있지 않으면 참.
- `STRING1 = STRING2`: 두 문자열이 동일하면 참.
- `STRING1 != STRING2`: 두 문자열이 다르면 참.
- `STRING1 < STRING2`: 문자열1이 문자열2보다 사전적으로 앞에 오면 참.
- `STRING1 > STRING2`: 문자열1이 문자열2보다 사전적으로 뒤에 오면 참.

**기타 연산자:**

- `-o OPTION`: 셸 옵션이 활성화되어 있으면 참.
- `-v VAR`: 셸 변수 VAR이 설정되어 있으면 참.
- `-R VAR`: 셸 변수 VAR이 설정되어 있고 이름 참조인 경우 참.
- `! EXPR`: 표현식이 거짓이면 참.
- `EXPR1 -a EXPR2`: 표현식1과 표현식2가 모두 참이면 참.
- `EXPR1 -o EXPR2`: 표현식1 또는 표현식2가 참이면 참.
- `arg1 OP arg2`: 산술 연산. OP는 -eq, -ne, -lt, -le, -gt, 또는 -ge 중 하나.

종료 상태:
- 표현식이 참이면 성공.
- 표현식이 거짓이거나 잘못된 인수가 주어지면 실패.

 

예시 - test 명령어 사용
# test로 연산 후 echo로 결과 확인
x=10
test $x -lt 5
echo $?

# 결과 false
1


# test로 파일이 존재하는 지 확인 후 echo로 결과 확인
test -e /etc/passwd
echo $?

# 결과 true
0


# test로 디렉토리인지 확인 후 echo로 결과 확인
test -d /tmp
echo $?

# 결과 true
0

 

예시 - [ 명령 ] 사용
### [  ]를 사용할 때는 반드시 대괄호 안에 양끝 한칸씩 공백을 입력 후 명령어를 입력해야 한다.
# [  ]로 연산 후 echo로 결과 확인
x=10
[ $x -lt 5 ]
echo $?

# 결과 false
1


# [  ]로 파일이 존재하는 지 확인 후 echo로 결과 확인
[ -e /etc/passwd ]
echo $?

# 결과 true
0


# [  ]로 디렉토리인지 확인 후 echo로 결과 확인
[ -d /tmp ]
echo $?

# 결과 true
0

 

산술연산에 쓰이는 let 과 expr

 

산술연산이 필요한 경우 let 과 expr 명령을 사용하면 된다.

# let 사용 예제
let sum=5+5
echo $sum

let mul=5*5
echo $mul

let "result = 30 / 10"
echo $result

# 결과
10
25
3

### expr 사용 예제
# 산술 연산
result=$(expr 5 + 3)
echo $result

# 문자열 처리
string="Shell Script"
length=$(expr length "$string")		# 문자열 길이
echo "Length of '$string' is $length"

substring=$(expr substr "$string" 7 6) 	# 문자열 특정 위치 추출
echo "Substring: $substring"

# 비교 연산
result=$(expr 5 != 3)
echo "5 != 3 : $result"


# 결과
8
Length of 'Shell Script' is 12
Substring: Script
5 != 3 : 1

 

let 과 expr의 차이점은 let은 변수에 직접 값을 할당할 수 있고 expr은 결과를 다른 변수에 할당하기 위해선 명령 치환을 사용해야 한다.

그래서 사용 목적도 다르다.

  • let: 주로 변수 간의 연산이나 반복문에서 사용된다.
  • expr: 주로 명령 치환을 통해 다른 명령에서 나온 값을 변수에 할당하고자 할 때 사용된다.
# let
let "total = 5 + 3"

# expr
count=$(expr $(ls -l | wc -l) - 1)

 

 

 

 


3. if - then - fi

대표적인 분기 명령어로 조건 명령의 실행 결과에 따라 서로 다른 명령어 블록을 실행한다.

사용방법 :
if [ 조건 ]; then
    # 조건이 참일 때 실행할 명령어
else
    # 조건이 거짓일 때 실행할 명령어 (선택사항)
fi

 

예시
# 예시
x=10
if test $x -gt 5
then
	echo "x is greater than 5"
fi

# 똑같은 명령
x=10
if [ $x -gt 5 ]
then
	echo "x is greater than 5"
fi

 

조건이 참이 되기 때문에 결과는 if 문 사이에 명령어 블록을 실행하게 된다.

 

 

실습 - 1
#!/bin/bash
#: Description		: simple 'if-then-fi' example

echo -n "Input number : "
read x
if [ $x -gt 5 ]
then
        echo "x is greater than 5"
fi

# 실행 결과
Input number : 6
x is greater than 5

 

 

실습 - 2
#!/bin/bash
echo -n "Input File Name : "
read fileName
if test -e $fileName
then
	ls -l $fileName
else
	echo "'$fileName' file does not exist!"
fi

# 실행 결과
Input File Name : /etc/passwd
-rw-r--r-- 1 root root 1884 Nov 21 19:15 /etc/passwd

 

 

 

 


4. case

case 명령어는 셸 스크립트에서 여러 가지 조건을 검사하고 그에 따라 다양한 명령어 블록을 실행하는데 사용된다.

case 문은 일반적으로 문자열 패턴에 따라 다른 동작을 수행할 때 유용하다.

사용방법 :
case 변수 in
    패턴1)
        # 패턴1에 매칭되면 실행할 명령어
        ;;
    패턴2)
        # 패턴2에 매칭되면 실행할 명령어
        ;;
    *)
        # 어떤 패턴에도 매칭되지 않을 때 실행할 명령어 (선택사항)
        ;;
esac

 

실습 - 1
#!/bin/bash 

echo -n "What do you want? "
read answer
case $answer in
	[yY]es) echo "System restart.";;
    	[Nn]o) echo "Shutdown the system";;
   	 *) echo "Entered incorrectly";;
esac

# 실행 결과
What do you want? No
Shutdown the system

 

 

실습 - 2
cat << END
================================
Please select a number.
--------------------------------
1 : Check disk usage
2 : Check the login user list
--------------------------------
END
echo -n "number : "
read number
case $number in
	1) df -h ;;
	2) who ;;
  	*) echo "Bad choice!"
           exit 1
esac
exit 0

# 실행 결과
apple@lww:~/bin$ case-exam2.sh
================================
Please select a number.
--------------------------------
1 : Check disk usage
2 : Check the login user list
--------------------------------
number : 22
Bad choice!
apple@lww:~/bin$ echo $?
1

 

 

 

 


5. 과제

스크립트를 실행하면 사용자로 하여금 디렉토리의 이름을 입력받게 하고 입력된 값이 디렉토리가 아니면 종료 코드가 1이 되도록 하여 스크립트를 종료하고 값이 디렉토리면 해당 디렉토리의 리스트를 /tmp에 [연월일.txt] 의 이름으로 저장되도록 하는 스크립트를 작성하라.

 

 

 

실습해보고 싶다면 아래 코드를 보지 않고 작성해보기

#!/bin/bash
#: Usage                : if-exam3.sh
#: Description          : The code saves the list of the entered directory to the /tmp directory.
echo -n "Input Directory : "
read dirName
if [ -d $dirName ]
then
        ls -al "$dirName" > /tmp/$(date +%Y%m%d).txt
        echo "Success."
else
        echo "Not a Directory."
        exit 1
fi

# 실행 결과
apple@lww:~/bin$ if-exam3.sh
Input Directory : /etc/passwd
Not a Directory.
apple@lww:~/bin$ if-exam3.sh
Input Directory : /usr/local
Success.
apple@lww:~/bin$ echo $?
0

 

 

 

 


 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKog2XlvGJQh9KY8ePCvUG7Je&si=TEShNqeC19g3tfp8

 

[따배셸] 셸 프로그래밍 시리즈

 

www.youtube.com

 

'Shell Script' 카테고리의 다른 글

Shell Script - 에러 처리  (0) 2024.01.10
Shell Script 기초(7)  (0) 2023.11.28
Shell Script 보안 - 코드 인젝션 취약점  (0) 2023.11.24
Shell Script 기초(5)  (0) 2023.11.24
Shell Script 기초(4)  (0) 2023.11.24