Bashscript | 3

명상록·2023년 2월 22일
0

shell script

목록 보기
3/5

이번 편에는 if문 case문 그리고 비교연산입니다. 비교연산도 연산자 포스팅에 엮고자 했는데 다른 블로그들을 둘러보았을 때 대개 조건문에 엮어서 진행했고 바위는 물길을 버틸지 모르겠지만 돌멩이는 흐름에 몸을 맡겨야지 싶어서 이렇게 진행합니다.

  • 비교 연산자

문자열 비교설명
"문자열1" = "문자열2"두 문자열이 같으면 참
"문자열1" != "문자열2"두 문자열이 다르면 참
-z "문자열"문자열이 NULL이면 참
-n "문자열"문자열이 NULL이 아니면 참

산술 비교설명
값1 -eq 값2equal
값1 -ne 값2not equal
값1 -lt 값2값1이 값2보다 작으면 참 less than
값1 -le 값2값1이 작거나 같으면 참less or equal
값1 -gt 값2값1이 값2보다 크면 참 greater than
값1 -ge 값2값1이 작거나 같으면 참greater or equal

파일 검사 조건설명
[ -b FILE ]블록 파일이면 참
[ -d FILE ]디렉토리라면 참
[ -e FILE ]파일이 존재하면 참
[ -f FILE ]파일이 존재하고 일반 파일이면 참(-e보다 주로 사용)
[ -L FILE ]심볼릭 링크 파일이면 참
[ -r FILE ]읽을 수 있는 파일일 때 참
[ -s FILE ]파일 크기가 0이 아니면 참
[ -w FILE ]쓰기 가능한 파일일 때 참
[ -x FILE ]실행 가능한 파일일 때 참

  • if, elif, else

정해진 공백 규칙을 따르지 않으면 오류를 맞이하게 됩니다.
./iftest.sh: line 6: [: missing `]'

1. IF
1	#!/usr/bin/bash
2
3	a=10
4	b=20
5
6	if [ $a == $b ] #
7	then 
8		echo "a is equal to b"
9	fi
10
11	if [ $a != $b ]
12	then
13		echo "a is not equal to b"	#두 수는 같지 않으니 13번 라인이 출력된다.
14	fi
2. ELSE
1	#!/usr/bin/bash
2
3	a=10
4	b=20
5
6	if [ $a -gt $b ]			#비교연산이 여기서 등장 그래서 묶어서 포스팅했나..!
7	then
8		echo a is greater than b
9	else
10		echo a is less than b	#a는 b보다 작으므로 10번 라인이 출력된다.
11	fi
3. ELIF
1	#!/usr/bin/bash
2
3	a=10
4	b=20
5
6	if [ $a == $b ] 
7	then
8	        echo a is equal than b
9	elif [ $a -gt $b ]
10	then
11	        echo a is greater than b
12	elif [ $a -lt $b ]
13	then
14	        echo a is less than b	#ELSE와 같이 조건이 더 생겼을 뿐 결과는 같다.
15	else
16	        echo None of the condition met
17	fi

4. 조건문 활용

앞서 진행한 예시들보다 복잡해 보이지만 난해할 것이 없습니다!

1	#!/usr/bin/bash
2
3	YYMMDD=`date "+%y%m%d"`
4
5	dir="/root"			#실습용으로 만든 계정이라 root를 썼고 보안을 위해서는 root 외 계정 권장
6	folder="/data_log"	#LOG FILE이 들어갈 디렉토리
7	file="DATE_${YYMMDD}.txt"	#LOG FILE NAME
8
9	if [ -e $dir$folder ]
10	then
11    	    cd $dir$folder
12        	echo $dir$folder already exists
13        	if [ -e $dir$folder/$file ]
14        	then
15           	    echo $file already exists
16                	date > $file
17                	echo Rewrote $file		#만약 LOG FILE이 존재하면 덮어쓰기를 진행한다.
18        	else
19            	    cd $dir$folder
20	                date > $file		
21    	            echo $file was created!	#CREATE TO LOG FILE
22        	fi
23	else
24    	    echo $folder does not exist		#위에 선언한 폴더가 존재하지 않을 경우
25        	mkdir $dir$folder; cd $dir$folder; date > $file		#디렉토리 생성, 이동, 파일 생성 
26 	        echo The $file was created in $dir$folder!
27	fi
  • case

1	#!/usr/bin/bash
2	
3	printf "사용하는 OS의 첫 알파벳을 입력해보세요 : "
4	read -n 1 var	#사용자에게 한 글자를 입력 받음.
5	
6	echo
7	case $var in
8	    "l" | "L") echo "리눅스" ;; # 입력한 값이 l이라면 실행
9	    "u" | "U") echo "유닉스" ;;    
10	    "w" | "W") echo "윈도우즈" ;;    
11	    "m" | "M") echo "맥OS" ;;    
12	    *) echo "뭔데"	#다른 OS도 많겠지만 간단하게 진행
13	exit 1
14	;; # default 마무리
15	esac
16	exit 0 

갑자기 튀어나온 exit, read에 당황스럽겠지만 차근차근 풀어나가겠습니다.

이쯤에서 계산기를 한 번 스크립트로 짜보겠습니다.직접 만들어보면 영감을 얻기 마련이니까요.

  • Calc

# !/usr/bin/bash

# 숫자 두 개 입력
echo "Enter Two numbers : "
read a
read b
 

# 기호 입력
echo "Enter Choice :"
echo "1. Addition"
echo "2. Subtraction"
echo "3. Multiplication"
echo "4. Division"
read ec


case $ec in
  1)res=`echo $a + $b | bc`
  ;;
  2)res=`echo $a - $b | bc`
  ;;
  3)res=`echo $a \* $b | bc`
  ;;
  4)res=`echo "scale=2; $a / $b" | bc`
  ;;
  *) echo "Unknown Number" ; exit 1 
  ;;
esac

echo "Result : $res"
  • While

1	#!/usr/bin/bash
2	
3	count=0
4
5	while [ ${count} -le 5 ] 
6	do
7	    echo ${count}
8	    count=$(( ${count}+1 ))		#((count++)) 단순하게 표현도 가능하다.
9	done

#5번 행의 대괄호 대신 이중 괄호를 이용해 논리 표현식을 사용할 수 있다. 
#while (( ${count} <= 5 )) 

위 주석을 이용해 한 번 더 스크립트를 짜보아도 되고 밑의 코드는 스킬 상승에 도움된다 싶어 공유합니다.

할 수 있을 거에요.


1	#!/usr/bin/bash
2
3	year=$1
4	month=$2
5
6	startNum=`date +"%u" -d ${year}${month}01`
7	startDate=`date +"%Y%m%d" -d ${year}${month}01`
8	endDate=`date +"%Y%m%d" -d "${year}${month}01 +1 month"`
9
10	echo -e "\t\t *** `date +"%b %Y" -d $startDate` ***"
11	echo -e "MON\tTUS\tWED\tTHU\tFRI\tSAT\tSUN"
12
13	i=1
14	while [ $i -lt $startNum ]
15	do
16		printf "\t"
17		((i++))
18	done

19	while [ $startDate != $endDate ]
20	do
21		dayOfWeek=`date +%u -d $startDate`
22		date=`date +%d -d $startDate`
23		printf "${date}\t"
24		if [ $((${dayOfWeek}%7)) == 0 ]
25		then
26			echo
27		fi
28		startDate=`date +%Y%m%d -d "$startDate +1 day"`
29	done
30	echo


  • For

1	#!/usr/bin/bash
2
3	list="1 2 3 4 5"
4	for var in $list
5	do
6        echo var value :$var
7	done
8
9	for var2 in "1 2 3 4 5"	
10	do
11	     echo var2 value :$var2
12	done

같아보이지만 다른 결과를 도출하는 두 가지 케이스를 만들어봤는데 보고 어떤 값이 도출되는지에 확신이 없으면 이또한 직접 짜보시길!

1	#!/usr/bin/bash
2
3	for file in /etc/*
4	do
5		echo ${file}
6	done

# for file in /etc/*; do echo ${file}; done;	
#엔터 대신 ;(세미콜론)을 사용하면 한 줄로 축약이 가능하다.(즉 터미널에서 사용 가능)
1	#!/usr/bin/bash
2	
3	for file in /etc/*
4	do
5	        if [ "${file}" == "/etc/passwd" ]; then
6   	    echo "Find it. ${file}"
7			break
8        	fi	
9	done

/etc/ 디렉토리의 존재하는 하위 파일, 디렉토리들을 출력하는 스크립트 그리고 break를 이용해 /etc/passwd를 찾으면 멈추는 스크립트를 짜보았습니다.

도움 받은 글
https://github.com/imysh578/Self-Study/blob/main/Linux/calendar/calendar.sh
https://jhnyang.tistory.com/191

profile
등불은 꺼질 때까지 계속해서 환하게 빛을 비춘다.

0개의 댓글