Bash Shell Programming

Bash Shell Programming(8)

Joon0464 2021. 7. 25. 00:14

본 글은 아래 영상을 통해 공부하고 작성했습니다. 제 글보다 영상 시청이 더 도움 될 것입니다.

https://youtu.be/hG9T3K00qiE

exit

  • 실행된 프로그램이 종료된 상태를 전달
  • 0 : 프로그램 또는 명령이 성공으로 종료했음을 의미
  • 1-255 : 프로그램 또는 명령이 실패로 종료했음을 의미
  • 1 : 일반에러
  • 2 : Syntax error
  • 126 : 명령을 실행할 수 없음
  • 127 : 명령이 존재하지 않음
  • 128 : 종료 시그널 + N(kill -9 PID로ㅓ 종료시 128+9=137 이 된다.)
  • $? : 종료 값 출력

echo $? 를 통해 이전에 실행한 명령어의 종료 코드를 조회
127의 종료코드가 출력되면 명령이 존재하지 않아서 실패했음을 의미한다.
1은 일반적인 에러를 의미한다.
ctrl + c로 종료하면 SIGINT에 의해 종료했음을 알 수 있다.
kill -l 명령어로 시그널 번호를 조회할 수 있다.

test

  • 비교연산자
  • test <명령어> 또는 [ 명령어 ]
  • 명령어 실행결과를 true(0) 또는 false(1)로 리턴한다.
  • 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 x값과 y값이 같지 않으면 true를 리턴
-e file 파일이 존재하면 true를 리턴
-d file 파일이 디렉토리면 true를 리턴
-f file 파일이 디렉토리면 false를 리턴
-x file 파일이 디렉토리면 true를 리턴

help test를 입력하여 document를 읽고 사용할 수 있다.
10보다 5가 작으므로 false인 1을 리턴한다.
10이 5보다 크기 때문에 true인 0이 출력된다.
/etc/passwd가 존재하기 때문에 true인 0이 출력된다.
/tmp는 디렉토리이기 때문에 -d 옵션에서는 0(true)이 -f 옵션에서는 1(false)가 출력된다.
test 대신 대괄호를 사용해서 test 명령어 사용 가능
산술연산에는 let 또는 expr이 사용된다.

if-then-fi

  • 조건 명령어. command 실행 결과에 따라 서로 다른 command를 실행
  • if command1 then command2 fi : command1이 true일 경우 command2를 실행, false일 경우 exit된다.
  • if commnad1 then command2 else command3 fi : command 1이 true일 경우 command2를 실행하고 false일 경우 command3를 실행한다.
# vi if-exam1.sh

#!/bin/bash
x=10
if test $x -gt 5
	then
    		echo "x is greater than 5"
fi

위와 같은 쉘 스크립트를 작성한다.

# chmod u+x if-exam1.sh
# if-exam1.sh

쉘 스크립트에 실행권한을 부여하고 스크립트를 실행시킨다.

결과가 정상적으로 출력된다.

# vi bin/if-exam2.sh

#!/bin/bash
if test -e /etc/passwd
        then
                ls -l /etc/passwd
        else
                echo "/etc/passwd file does not exist!"
fi
# chmod u+x if-exam2.sh
# if-exam2.sh

쉘 스크립트 출력 결과

case

  • $var의 값에 따라 선택해서 명령어를 실행
#

#!/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

;; 는 명령어의 끝을 의미한다.

[yY] 와 같이 입력하면 y를 대소문자 구별없이 인식한다.

# chmod u+x case-exam1.sh
# case-exam1.sh

case-exam1.sh를 실행하고 yes, no, 아무 값을 3번 넣어본 결과이다.

 

종합 예제

 

# vi bin/case-exam2.sh

#!/bin/bash
#:Usage		: case-exam.sh
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
# chmod u+x case-exam2.sh
# case-exam2.sh

연습문제

  • 다음의 조건에 맞는 shell script 를 작성하세요.
  1.  대화식으로 사용자에게 디렉토리 이름을 입력 받으시오.
  2. 입력한 디렉토리 이름이 실제 디렉토리이면 해당 디렉토리 모든 파일 목록을 /tmp/날짜.txt 로 저장하고, 디렉토리가 아니면 "It's not a directory." 메시지를 출력하고 종료하는 shell script를 작성하시오.
# vi bin/joon.sh

#!/bin/bash
echo -n "Input a directory name:"
read name
if test -d $name
then
        ls -l $name > /tmp/$(date +%Y%m%d).txt
else
        echo "It's not a directory"
fi
exit 0

'Bash Shell Programming' 카테고리의 다른 글

Bash Shell Programming(9)  (0) 2021.07.25
Bash Shell Programming(7)  (0) 2021.07.23
Bash Shell Programming(6)  (0) 2021.07.23
Bash Shell Programming(5)  (0) 2021.07.22
Bash Shell Programming(4)  (0) 2021.07.21