e_yejun
Jun_ : Pwn
e_yejun
전체 방문자
오늘
어제
  • 분류 전체보기 (240)
    • Profile (1)
    • Pwnable (54)
    • Reversing (14)
    • Network (8)
    • Forensic (10)
    • Embedded (4)
    • Android (2)
    • Web (18)
    • 알고리즘 (42)
    • 프로그래밍 (24)
    • 프로젝트 (6)
    • 1-day (7)
    • CTF (15)
    • 기타 (33)
    • 일기장 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • dvwa
  • how2heap
  • X86
  • 1-day
  • wargame
  • BOF
  • Heap
  • x64
  • rev-basic
  • dreamhack.io

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e_yejun

Jun_ : Pwn

프로그래밍

[Linux] shell script(쉘 스크립트) 기본 문법

2022. 5. 12. 23:56

shell 이란?

 - 사용자와 커널 사이에서 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 한다.

 

 

쉘 프로그래밍 기본 설정

 - 쉘 스크립트를 사용한 파일은 .sh 확장자를 가지고, 맨 처음 행에 #!/bin/bash를 쓴다.

#!/bin/bash
echo "Hello World"

 

 - 실행 방법(example.sh)은 다음 사진과 같다.

   1) 실행권한을 부여하고 실행

$ chmod 755 example.sh
$ ./example.sh

   2) sh 명령어를 이용하여 실행

$ sh example.sh

 

 - 주석은 #을 사용한다. 주석처리 된 코드는 실행되지 않는다.

#!/bin/bash
echo "Hello World"  #주석은 실행되지 않음.

 

 

변수 활용

 - 변수 값을 대입할 때는 '='를 기준으로 앞, 뒤에 공백이 없어야 한다.

 - 변수를 사용할 때는 $[변수명] 형태로 사용한다.

#!/bin/bash
string="test"
num=5
echo "string : $string"
echo "num : $num"

   <출력 값>

string : test
num : 5

 

 - 사용자에게 입력을 받아 변수에 저장할 때는 read 명령어를 사용한다.

#!/bin/bash
echo -n "Input >> "
read input
echo "Input data : $input"

 

 - 특별한 변수

변수 설명
$0 실행되는 파일의 이름 (스크립트명)
$1 ~ $9 인자 값(공백을 기준으로 나누
$* 모든 인자 출력
$# 인자의 개수 출력
$@ 모든 인자 각각 처리
$? 바로 전에 실행한 면령어의 종료 값(0:성공, 1:실패)
$$ 현재 쉘 스크립트의 PID(프로세스 ID)
$! 마지막으로 실행한 백그라운드 PID

 

#!/bin/bash
echo "\$0 : $0"
echo "\$1 : $1"
echo "\$2 : $2"
echo "\$* : $*"
echo "\$# : $#"
echo "\$\$ : $$"

   <출력 값>

# 입력예제 : ./example.sh hello 1

$0 : example.sh
$1 : hello
$2 : 1
$* : hello 1
$# : 2
$$ : 731	#프로세스ID

 

 

숫자의 연산

 - num3=`expr $num1 + $num2` 와 같은 형태로 숫자의 연산 수행.

 - 이때 '=' 앞뒤로 띄어쓰기를 꼭 하지 않고, `(역따옴표)로 묶어 expr 명령어를 수행한다.

 - expr 명령어에서는 연산자와 피연산자 사이를 꼭 띄어쓰기를 사용해야 한다.

#!/bin/bash
echo -n "Input num1 >> "
read num1
echo -n "Input num2 >> "
read num2

sum=`expr $num1 + $num2`
echo "plus : $sum"
echo "minus : `expr $num1 - $num2`"
echo "mul : `expr $num1 \* $num2`"
echo "div : `expr $num1 % $num2`"

   <출력 값>

Input num1 >> 5
Input num2 >> 3
plus : 8
minus : 2
mul : 15
div : 2

 

 

특수문자

 - 숫자의 연산에서 확인해보면 곱하기를 수행하는 행에서 '*' 앞에 역슬래시(\)가 사용된 것을 볼 수 있다.

 - expr 연산에서는 연산자로 사용하기 위해 역슬래시(\)가 사용되고, 일반적으로는 특수문자의 역할이 아닌 일반 문자열을 표현하고 싶을 때 역슬래시(\)를 사용한다.

 

 

비교 연산자

 - 사용 형태는 조건문 예제의 '-gt'와 같다.

비교 명령어 의미
-gt 크다 (>)
-ge 크거나 같다 (>=)
-lt 작다 (<)
-le 작거나 같다 (<=)
-eq 같다 (==)
-ne 다르다 (!=)
-n null이 아니면 true
-z null이면 true

 

 

조건문 (if)

 - 기본 문법은 if [ 조건 ] ; then 명령어 fi 이다. 예제를 통해 확인해보자.

#!/bin/bash
echo -n "Input number? "
read num
if [ $num -gt 5 ]; then
	echo "$num is greater than 5"
else
	echo "$num is less than 5"
fi

   <출력 값>

Input number? 7
7 is greater than 5

 

 

조건문 (switch)

 - 기본 문법은 case 변수 in 패턴) 명령어;; esac이다. 예제를 통해 확인해보자.

 - 마지막 패턴인 *는 위에 패턴을 제외한 모든 경우를 지칭한다.

#!/bin/bash
echo -n "Input jumsu : "
read jumsu
grade=`expr $jumsu / 10`

case $grade in
    "10") echo A;;  
    "8") echo B;;
    "7") echo D;;
    *) echo F;;     # *는 따옴표로 묶을 경우 문자로 인식한다.
esac

   <출력 값>

Input jumsu : 100
A

 

 

파일 비교 연산자

비교 명령어 의미
-f [파일명] 파일이 일반파일이면 true
-d [파일명] 파일이 디렉토리이면 true
-r [파일명] 파일이 읽기 권한이 있으면 true
-w [파일명] 파일이 쓰기 권한이 있으면 true
-x [파일명] 파일이 실행 권한이 있으면 true
-e [파일명] 파일의 존재여부, 있으면 true
-z [파일명] 파일의 크기가 0이면 true

 

예제) -d를 이용해서 $1(인자1)로 받은 경로의 파일이 몇개가 있는지 확인하는 프로그램

#!/bin/bash
if [ $# -ne 1 ]; then
	echo "usage : command arg1"
	exit 1
else
	if [ -d $1 ]; then
		file_cnt=`ls -l $1 | wc -l`
		echo "directory '$1' file_cnt : $file_cnt"
	fi
fi

 

 

반복문 (for)

 - 기본 문법은 for 변수 in 단어리스트 do 명령어 done 이다.

for ch in a b c
do
    echo "For statement : $ch"
done

   <출력 값>

For statement : a
For statement : b
For statement : c

 

예제1) 디렉토리 경로를 입력받아 해당 경로의 모든 파일의 백업본을 생성하는 프로그램

#!/bin/bash
echo -n "Input directory? "
read dir 

for ch in `ls $dir`
do
    cp $dir/$ch $dir/$ch.bak
done

 

예제2) 단을 입력받는 구구단 프로그램

#!/bin/bash
echo -n "Input dan >> "
read dan

for i in {1..9}
do
    result=`expr $dan \* $i`
    echo "$dan * $i = $result"
done

 

 

반복문(while)

 - 기본 문법은 while 조건 do 명령어 done 이다.

#!/bin/bash
a=0
while [ $a -lt 5 ]
do
    echo "$a"
    a=`expr $a + 1`
done

 

 

함수

 - 함수의 선언은 '함수이름() { 명령어 }' 으로 한다.

 - 함수의 호출은 '함수이름 [인자1] [인자2]'으로 한다.

#!/bin/bash
prt()
{
    echo "prt function.. $1 $2"
}

echo "test..."
prt 5 2

   <출력 값>

test...
prt function.. 5 2

 

예제) 각 연산을 함수로 구현한 계산기 프로그램

#!/bin/bash
plus()
{
    echo "$1 + $2 = `expr $1 + $2`"
}
minus()
{
    echo "$1 - $2 = `expr $1 - $2`"
}
mul()
{
    echo "$1 * $2 = `expr $1 \* $2`"
}
div()
{
    echo "$1 / $2 = `expr $1 / $2`"
}
mod()
{
    echo "$1 % $2 = `expr $1 % $2`"
}

echo -n "Input number >> "
read num1 num2
echo -n "Input operate >> "
read op

case $op in
    "+")    plus $num1 $num2;;
    "-")    minus $num1 $num2;;
    "*")    mul $num1 $num2;;
    "/")    div $num1 $num2;;
    "%")    mod $num1 $num2;;
    *)    echo "Error.. Invalid operate";;
esac

 

 

번외) vi 편집기를 열어서 자동으로 글 입력 프로그램

#!/bin/bash

if [ -f $1 ]; then
    echo "Error.. File exist!!"
else
    echo "#####################" >> $1
    echo "## Author : Lee Ye Jun#" >> $1
    echo "## Date : `date | cut -c1-13`" >> $1
    echo "#####################" >> $1
    echo "#!/bin/bash" >> $1
    echo " " >> $1
    vi +$ $1
    chmod 755 $1
fi

 

 

 

 

    '프로그래밍' 카테고리의 다른 글
    • [PyQt5] 나만의 퀴즈 프로그램 만들기
    • [PyQt5] 나만의 계산기 만들기
    • [C, C++] #pragma pack의 개념과 사용방법
    • [CSS] 반응형 웹 높이 설정하는 방법 (width, height)
    e_yejun
    e_yejun
    정리노트 •_•

    티스토리툴바