본문 바로가기
모의해킹 침해대응 과정/본 과정

쉘 스크립트(bash)_1 / day28

by 알거음슴 2021. 5. 4.

매직넘버 : 스크립트의 첫줄 첫 캐릭터가 #!일 경우 이후 경로에 있는 쉘로 아래 내용을 해석한다.

-> #!/bin/bash = 커널이 아래 내용을 bash 쉘로 해석한다.

 


1. 입/출력

 1) echo : 입력받은 내용을 출력함.

예제1)
#!/bin/bash
echo "Todays date and time : "
date

[root@linux200 ~/bin]# echo.sh
Todays date and time : 
2021. 05. 05. (수) 03:41:29 KST

예제2)
#!/bin/bash
echo -n "Todays date and time : "
date

[root@linux200 ~/bin]# echo.sh
Todays date and time : 2021. 05. 05. (수) 03:41:29 KST

* echo -n : 개행문자를 무시하는 옵션, 즉 문장의 끝에 바로 이어서 내용을 출력할 수 있게 함

 

 2) read : 입력받은 내용을 변수로 선언함.

예제1)
#!/bin/bash
echo -n " What your name? : "
read FNAME
echo $FNAME
[root@linux200 ~/bin]# read.sh
 What your name? : park je hyen
park je hyen

예제2)
#!/bin/bash
echo -n " What your name? : "
read FNAME MNAME LNAME
echo $FNAME $MNAME 
[root@linux200 ~/bin]# read.sh
 What your name? : park je hyen
park je 

예제3)
#!/bin/bash
echo -n " What your name? : "
read FNAME MNAME
echo $FNAME $MNAME 
[root@linux200 ~/bin]# read.sh
 What your name? : park je hyen
park je hyen

* 예제3 스크립트 처럼 hyen은 3번째 필드이나, MANE 이후에 입력된 내용임으로 NAME에 종속된다.

 

2. 숫자 다루기

 1) expr : 연산을 실행함

expr 1 + 5 : 더하기
expr 5 - 1 : 뺴기
expr 3 \* 3 : 곱하기 ( *의 경우 별도 의미가 있기에 탈출문자와 함깨 쓰임)
expr 10 / 2  : 나누기

* 단 소숫점 이하 숫자는 출력되지 않는다, 간단한 스크립트를 지원함으로 그 이상의 기능은 다른 언어를 활용.

 

3. 조건문

 0) test 명령어 ( test = [] )

식을 평가하고 그 식에 대한 논리값을 반환한다. 종료 상태가 0이면 참을 의미하고 0이 아니면 거짓을 의미한다. test 명령어와 [ ]는 같은 기능을 갖는다.

 test 내의 참과 거짓을 구분하는 주요 연산자들이 있다.

 1) 파일 관련 연산자

-d file 파일이 존재하고 디렉토리인 경우 -f file 파일이 정규 파일인 경우
-r file 파일이 존재하고, 읽을 수 있을 경우 -x file  파일이 존재하고, 쓰기 가능한 경우
-s file 파일이 존재하고, 빈 파일이 아닌경우    

 2) 문자열 관련 연산자

A = B A 문자가 B 문자와 같은경우 A != B A 문자가 B 문자와 같지않은 경우
-z A A 문자의 길이가 0인경우 (NULL) -n A A 문자의 길이가 NULL이 아닌경우

 3) 산술연산 관련 연산자

exprA -eq exprB A연산과 B연산이 같은경우 exprA -ne exprB A연산과 B연산이 다른경우
exprA -lt exprB A연산이 B연산보다 작은경우 exprA -le exprB A연산이 B연산과 작거나 같은경우
exprA -gt exprB A연산이 B연산보다 큰경우 exprA -ge exprB A연산이 B연산과 크거나 같은경우

* 산술연산 시 소숫점 아래 숫자는 무시한다.

 

 1) if 구문 ( if ~ then ~ fi )

내용이 참일경우와 아닐경우를 나눠서 원하는 값을 출력한다.

예제1)
#!/bin/bash
echo -n " Enter Your Filename : "
read FILE1

if [ -x $FILE1 ] ; then
    . $FILE1
else
    echo " chack execute permission. "
    exit 1
fi

예제2)
#!/bin/bash
echo -n " Enter Your Filename? : "
read FILE1

if test -d $FILE1 ; then
    echo " this file is directoty file ! "
elif test -f $FILE1 ; then
    echo " this file is regular file ! "
else
    echo " this file is other type file ! "
fi

예제1) if 구문의 경우 위에서 배운 test 으로 조건을 구성하거나 CMD 로 조건을 구성한다. (위 내용은 [] 로 구성)

then 이후 내용은 참인경우 값 else 이후의 값은 거짓일 경우의 값, 마지막은 fi 를 통해 구문을 완성한다.

예제2) 위 구문과 동일하나, elif 의 경우 추가적인 조건을 추가할 수 있는 구문이다.

 

 1-1) 인자 처리 구문. ( $#, $0 ... )

예제1)
#!/bin/bash

if [ $# -ne 1 ] ; then
    echo "Usage: $0 <filename>"
    exit 1
fi
FILE1=$1

FILESIZE=$(wc -c < $FILE1)
#echo $FILESIZE
if [ $FILESIZE -ge 5120 ] ; then
    echo " $FILE1 is a big file ! - $FILESIZE"
else
    echo " $FILE1 is a small file ! - $FILESIZE"
fi

조건 내용에 인자값으로 구성할 수 도 있다. 

 

1-2) 변수가 비어있을 경우 

예제1)
#!/bin/bash
VAR='hello world'
if [ "X$VAR" = "X" ] ; then
    echo "VAR 변수는 비어있엉 ㅋㅋ루삥빵뽕 "
else
    echo "VAR 변수는 값이있넹.. ㅋㅋ루삥뽕 "
fi

예제2)
#!/bin/bash
VAR=
if [ "X$VAR" = "X" ] ; then
    echo "VAR 변수는 비어있엉 ㅋㅋ루삥빵뽕 "
else
    echo "VAR 변수는 값이있넹.. ㅋㅋ루삥뽕 "
fi

예제1) 의 경우 if [ x'hello world' = x ] ; then 으로 조건이 붙음, 그럼으로 거짓값이 출력됨.

예제2) 의 경우 if [ x = x ] ; then 으로 조건이 붙음, 그럼으로 참값이 출력됨.