14일차 - 리눅스 (Shell)

Jk Lim·2023년 4월 27일
0

MLOps 부트캠프

목록 보기
13/34

14일차는

  1. 리눅스의 쉘(Shell)
  2. 조건문
  3. 반복문에 대해서 학습하였다.

1.쉘(Shell)

(1) 쉘 스크립트의 선언부와 실행

  • #!/bin/bash : bash header 선언부 - 개발자가 작성한 shell script가 bash 기발을 우선으로 작성되어졌음을 나타냄 → 자동으로 응용프로그램을 찾아가는 것이 아님
[root@localhost ~]# touch test.sh
[root@localhost ~]# file test.sh
test.sh: empty
[root@localhost ~]# cat > test.sh
#!/bin/bash           ### 쉘 스크립트의 선언부
[root@localhost ~]# file test.sh
test.sh: a /bin/bash script, ASCII text executable, with no line terminatorsd
### 쉘 스크립트의 실행
[root@localhost ~]# file test.sh
test.sh: Bourne-Again shell script, ASCII text executable
[root@localhost ~]# bash test.sh
hi
[root@localhost ~]# . ./test.sh
hi
[root@localhost ~]# chmod 0740 test.sh
[root@localhost ~]# ls -l test.sh
-rwxr-----. 1 root root 20  427 10:44 test.sh
[root@localhost ~]# ./test.sh
hi

(2) 변수

  • 환경변수
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $USER
root
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $TERM
xterm-256color
[root@localhost ~]# tty
/dev/pts/1
[root@localhost ~]# echo $LOGNAME
root

  • 사용자 정의 변수 (규칙 : 문자로시작, 공백이 없어야함) : 변수는 포인터의 결정판. 메모리 영역에 공간,주소를 할당하고 주소를 통해서 값을 가져옴.
[root@localhost ~]# a1=10
[root@localhost ~]# echo $a1
10

  • 위치 매개변수와 특수변수
[root@localhost ~]# cat argument.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo $*   ### 모든 매개변수
echo $#   ### 매개변수의 총 개수
echo $$   ### 프로그램의 PID Number
echo $?   ### 최근 명령의 종료 상태 출력 (정상 = 0 / 비정상 = 다른 숫자)
[root@localhost ~]# . ./argument.sh 1 2 3 4 5     ### 터미널에서 실행
-bash
1
2
3
1 2 3 4 5
5
1476     ### 터미널에서 실행
0
[root@localhost ~]# chmod u+x argument.sh
[root@localhost ~]# ./argument.sh 1 2 3 4 5       ### argument.sh를 실행
./argument.sh
1
2
3
1 2 3 4 5
5
2942     ### argument.sh에 대한 PID Number
0
[root@localhost ~]# echo $$
1476     ### 터미널의 PID Number

(참고)read

[root@localhost ~]# cat read.sh
#!/bin/bash
echo -n "값 입력:"
read x
echo $x
[root@localhost ~]# chmod u+x read.sh
[root@localhost ~]# ./read.sh
값 입력:10
10

2.조건문

(1) test

  • test는 크게 세가지 부분인 (1) 파일 시스템, (2) 문자 비교, (3) 숫자 비교로 나뉜다.
  • shell test 명령어 -b 블록 파일인지 확인 후 $? 변수에 결과 값 저장
[root@localhost ~]# test -b /dev/sda
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -b /dev/sda
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -b /etc/passwd
[root@localhost ~]# echo $?
1

산술 비교 표

종류설명
-eq같으면 참
-ne같지않으면 참
-gt> 이면 참
-ge>= 이면 참
-lt< 이면 참
-le<= 이면 참
!참이면 거짓, 거짓이면 참
-a둘 다 같으면 참(AND)
-o둘 중 하나만 참이면 참(OR)

(2) if

(참고) Shell 스크립트에서 ; && &의 기능

  • ;  앞의 명령어가 실패해도 다음 명령어가 실행
  • &&  앞의 명령어가 성공했을 때 다음 명령어가 실행
  • & 앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행
  • 문법
if [ 조건 ]  ### 공백 규칙 있음 주의
then
	조건 만족시 실행
fi
  • 변수 생성 규칙
[root@localhost ~]# AA='ls -l'
[root@localhost ~]# echo $AA
ls -l
[root@localhost ~]# AA="ls -l"
[root@localhost ~]# echo $AA
ls -l
[root@localhost ~]# AA=`ls -l`
[root@localhost ~]# echo $AA
ls -l
[root@localhost ~]# AA=`ls -l`    ### 명령어의 결과를 집어넣고 싶을 때 1
[root@localhost ~]# echo $AA
합계 68 -rw-r--r--. 1 root root 11 424 12:08 ? c -rwxr-x---. 1 root...
[root@localhost ~]# AA=$(ls -l)    ### 명령어의 결과를 집어넣고 싶을 때 2
[root@localhost ~]# echo $AA
합계 68 -rw-r--r--. 1 root root 11 424 12:08 ? c -rwxr-x---. 1 root...

(3) case

  • 예제
[root@localhost ~]# cat case_test1.sh
#!/bin/bash

case $1 in

start|START)
	echo $1
	;;
stop|STOP)
	echo $1
	;;
*)
	echo "start 또는 stop 만 입력하세요."
	;;
esac
[root@localhost ~]# bash case_test1.sh START
START
[root@localhost ~]# bash case_test1.sh stop
stop
[root@localhost ~]# bash case_test1.sh restart
start 또는 stop 만 입력하세요.
  • 예제 (함수사용)
[root@localhost ~]# cat case_test2.sh
#!/bin/bash
start(){
	echo start
}

stop(){
	echo stop
}

case $1 in

start|START)
	start
	;;
stop|STOP)
	stop
	;;
restart|RESTART)
	stop
	start
	;;
*)
	echo "[start,stop,restart] 만 입력하세요."
	;;
esac

3. 반복문

(1) for

  • 예제
[root@localhost ~]# ls /proc | grep ^[0-9] | head -5
1
10
1032
1033
1037
[root@localhost ~]# for i in $(ls /proc | grep ^[0-9])
> do
> ls -l /proc/$i/exe 2> /dev/null
> done
lrwxrwxrwx. 1 root root 0  427 10:16 /proc/1/exe -> /usr/lib/systemd/systemd
lrwxrwxrwx. 1 root root 0  427 10:16 /proc/10/exe
lrwxrwxrwx. 1 root root 0  427 10:16 /proc/1032/exe -> /usr/sbin/sshd
lrwxrwxrwx. 1 root root 0  427 10:16 /proc/1033/exe -> /usr/sbin/cupsd
lrwxrwxrwx. 1 root root 0  427 10:16 /proc/1037/exe -> /usr/sbin/rsyslogd
...

(2) while : 조건을 만족하는 동안

  • 예제
#!/bin/bash

var=5
while [ $var -lt 10 ]
do
        echo loop test
        var=`expr $var + 1`
done
  • 예제 (로그아웃 모니터링)
#!/bin/bash
while who | grep ^user > /dev/null
do
        sleep 10
done
echo "user 님이 로그아웃하였습니다."

(3) until : 조건을 만족할 때까지

  • 예제 (로그인 모니터링)
[root@localhost ~]# cat until_test1.sh
#!/bin/bash
until who | grep ^user
do
	sleep 10
done
echo "user 님이 지금 막 접속하셨습니다."

0개의 댓글