본문 바로가기
개발/linux

bash 기초 Shell Script(쉘 스크립트)

by 가시죠 2021. 1. 18.
반응형

배시 (Bash, Bourne-again shell, 본 어게인 셸)은 본 셸을 대체하는 자유 소프트웨어로서 GNU 프로젝트를 위해 브라이언 폭스(Brian Fox)가 작성한 유닉스 셸이다.[2][3] 1989년 발표되어 GNU 운영 체제 리눅스, 맥 OS X 그리고 다윈  운영 체제의 기본 셸로 탑재되어 광범위하게 배포되었다. 또한 DJGPP 노벨 넷웨어에 의해 도스로 이식되었고 시그윈 MinGW의 배포로 마이크로소프트 윈도로 이식되었다.

출력

$ echo "Hello World"

Hello World
$ printf "Hello World"

Hello World

변수

$ MYVAR = asdftest

$ echo $MYVAR

asdftest

$( )를 이용하여 명령의 출력을 변수에 넣기

$ CMDOUT=$(pwd)

$ echo CMDOUT

/.../...  <- pwd를 실행한 내용이 출력

위치매개변수 (echoparams.sh)

echo $# -- 매개변수의 갯수

echo $0 --스크립트 이름


#echoparams.sh 안의 내용
echo $#
echo $0
echo $1
echo $2
echo $3



$./echoparams.sh VAR is ABC

3
./echoparams.sh
VAR
is
ABC

조건분기


#if 명령
#then
#	다른 명령
#else
#	또 다른 명령
#fi

#현재 디렉토리를 /tmp로 변경. 성공이면 then 절 실행
if cd /tmp
then
	echo "/tmp 디렉토리의 내용:"
    ls -l
fi

#파이프로 연결된 명령
if ls | grep pdf
then
	echo "pdf 파일이 하나이상 존재함"
else
	echo "pdf 파일 없음"
fi

파일 판정 연산자


if [[ -e $FILENAME ]]
then 
	echo $FILENAME 파일이 존재함
fi

파일 판정 연산자표

파일 판정 연산자 용도
-d 주어진 디렉토리가 존재하는지 판정
-e 주어진 파일이 존재하는지 판정
-r 주어진 파일이 존재하며 읽을 수 있는지 판정
-w 주어진 파일이 존재하며 쓸 수 있는지 판정
-x 주어진 파일이 존재하며 실행할 수 있는지 판정

수치 판정 연산자

수치 판정 연산자 용도
-eq 두 수가 같은지 판정
-gt 앞의 수가 뒤의 수보다 큰지 판정
-lt 앞의 수가 뒤의 수보다 작은지 판정

비교문 주의


# 단순 비교 시 (이중 대괄호)
if [[ $VAL1 < $VAL2 ]] 

# 수치 비교시 (이중 괄호)
if (( $VAL1 < $VAL2 ))

루프반복


# 변수 i가 1000보다 작은 동안 반복된다.
# 실행될때마다 i 값을 화면에 출력(echo) 한다.
# 그 후 let 명령을 이용해서 i++ 를 실행(i=i+1)한다. 
i=0
while (( i < 1000))
do
	echo $i
	let i++
done


# 아래와 같이 while 문에 명령을 실행하여 루프반복을 할 수도 있다.
while ls | grep -q pdf
do
	echo -n '이름에 pdf가 포함된 파일이 이 폴더에 있음:'
    pwd
    cd ..
done


# for 문 샘플1
for ((i=0; i < 100; i++))
do
	echo $i
done

# for 문 샘플2
# 인자값을 for 문 돌며 그대로 출력
for ARG
do
	echo 인자값 : $ARG
done

# for 문 샘플3
# VAR에 20 3 ....등 값을 임의로 지정하여 순차적으로 출력
for VAL in 20 3 멍멍이 고양이 7 파인애플
do
	echo $VAL
doen

# for 문 샘플4 실행문을 for문에 대입
# 현재 위치에 파일명(확장자포함)에 pdf가 포함된 모든 파일 출력
for VAR in $(ls | grep pdf)
do
	echo $VAL
done    

함수


# 문법
function myFunc()
{
 # 함수의 내용
}

# 아래와 같이 function 또는 () 둘중 하나를 생략해도 되지만, 가독성을 위해 둘다 적어주는게 좋다

# 문법 (생략1)
function myFunc
{
 # 함수의 내용
}

# 문법 (생략2)
myFunc()
{
 # 함수의 내용
}

# 함수 호출 및 인자 넘기는 법 (괄호 없이 스페이스로 구분하여 인자를 적어준다)
myFunc 2 /aaa "test"

운영체제 확인 쉘 스크립트


# 파일명 : checkos.sh
# 사용법 : ./checkos.sh

#------------------
# type : 지정된 명령어가 쉘에 내장된 명령어인지, 외부명령어인지, 앨리어스 명령어인지 등을 확인하는 명령어이다.
# type -t : 유형을 알려주는 옵션
#
# /dev/null : null 장치로 그냥 버린다는 의미
# 명령어 또는 실행파일 &> /dev/null
# 실행로그, 실행오류로그를 /dev/null로 보낸다는 의미로 리턴되는 메시지를 보지 않고 버린다는 의미이다.
# aa.log 파일은 그대로 유지 하면 안의 내용을 비우고 싶을때 (0 byte) /dev/null > aa.log
#------------------

# 윈도우에만 존재하는 wevtutil 명령어를 체크하고 리턴되는 출력문자는 버린다. 존재하면 true, 해당 명령어가 없으면 false
if type -t wevtutil &> /dev/null
then
	OS=Windows
# 맥에만 존재하는 scutil 명령어를 체크하고 리턴되는 출력문자는 버린다. 존재하면 true, 해당 명령어가 없으면 false    
elif type -t scutil &> /dev/null
then
	OS=Mac
# if문 모두 false라면..        
else
	OS=Linux
fi
echo $OS
반응형

댓글