Shell Script 산술연산 / 조건문

식빵·2022년 3월 2일
0

Shell Script

목록 보기
4/5
post-thumbnail

🍀 산술 연산


📌 산술연산 사용을 위한 부호


$(expr)$[ ]$(( ))
+++
---
***
%%%
  • 어느 것을 써도 상관은 없지만, 거의 $[ ]를 많이 씀
    • 단, $[ ]bash에서만 동작하니 sh 에서는 쓰지 말것!
  • 변수 이름 사용연산 결과를 저장 가능
    • ex1) something=$(($var1 + $var2))
    • ex2) $((something = $var1 + $var2))
    • 위 3가지($(expr), $[ ], $(())) 모두 이런 동작을 지원한다.
  • (()) 마치 프로그래밍 lang 같이 동작함.
    • 그래서 아래와 같은 복잡한 연산자도 사용 가능
      • += -= *= /= %=
      • >>= <<= &= ^= |=
      • ** << >>
      • & | && ||




📌 산술연산 스크립트 연습

위에서 본 3가지($(expr), $[ ], $(())) 를 사용해서 간단한 스크립트를 작성해보자.


스크립트-1 : 골고루 써보기

#!/bin/bash

read -p "Input two numbers : " num1 num2
echo
echo "Add = $(expr $num1 + $num2)"
echo "Sub = $(expr $num1 - $num2)"
echo "Div = $(expr $num1 / $num2)"
echo "Mod = $(expr $num1 % $num2)"

echo
read -p "Input two numbers : " num1 num2
echo "Add = $[$num1 + $num2]"
echo "Sub = $[$num1 - $num2]"
echo "Div = $[$num1 / $num2]"
echo "Mod = $[$num1 % $num2]"

echo
read -p "Input two numbers : " num1 num2
echo "Add = $((num1 + num2))"
echo "Sub = $((num1 - num2))"
echo "Div = $((num1 / num2))"
echo "Mod = $(($num1 % $num2))"

echo
var1=$(expr $num1 + $num2) # + 사이사이에 띄어쓰기!
echo $var1

var2=$[$num1+$num2]
echo $var2

var3=$((num1+num2)) # 변수명 앞에 $는 필수 아님
echo $var3

((var4=num1+num2))
echo $var4

실행-1

[dailycode@myComp:lab]$ ./e.sh
Input two numbers : 32 4

Add = 36  # $(expr $num1 + $num2)
Sub = 28  # $(expr $num1 - $num2)
Div = 8   # $(expr $num1 / $num2)
Mod = 0   # $(expr $num1 % $num2)"

Input two numbers : 7 4
Add = 11  # $[$num1 + $num2]
Sub = 3   # $[$num1 - $num2]
Div = 1   # $[$num1 / $num2]
Mod = 3   # $[$num1 % $num2]

Input two numbers : 53 3
Add = 56  # $((num1 + num2))
Sub = 50  # $((num1 - num2))
Div = 17  # $((num1 / num2))
Mod = 2   # $(($num1 % $num2))

56   # var1=$(expr $num1 + $num2)
56   # var2=$[$num1+$num2]
56   # var3=$((num1+num2))
56   # ((var4=num1+num2))



스크립트-2 : $(()) 보충

#!/bin/bash

number1=2 number2=3
echo num=$number1, num2=$number2

((number1+=2))
echo num=$number1

((number2 = $number1 ** 2))
echo number2=$number2 number1=$number1

((number1++))
echo number1=$number1

실행-2

[dailycode@myComp:lab]$ ./f.sh
num=2, num2=3
num=4					# ((number1+=2))
number2=16 number1=4	# ((number2 = $number1 ** 2))
number1=5				# ((number1++))





🍀 조건문: if


📌 기본 문법

if condition
then 
	process
elif condition
	then process
else
	process
fi
  • 주의: fi 는 if 문 종료를 의미한다. 반드시 작성한다.



📌 [ ], [[ ]], (( ))

다른 프로그래밍 언어에서는 if 를 쓰면 거의 조건을()안에 적는다.
그런데 쉘 스크립트에는 이 () 역할을 하는 것이 3 가지나 있다.

  • if [ 조건문 ]
  • if [[ 조건문 ]]
  • if (( 조건문 ))

그런데 그 차이점을 하나하나 살펴 보는 건... 생각보다 알아야할 게 너무 많다.
숫자, 문자열 비교 같은 상황에서 어떻게 쓰이는지만 간단하게 알아가자.

참고: 너무 궁금하면 이 글을 참고하세요~



📌 숫자 비교 테스트


1. 사용되는 부호

[ ](( ))설명
-eq==equal to
-ne!=not equal to
-ge>=not equal to
-gt>greater than
-le<=less than & equal to
-lt<less than

사실 [], [[]] 도 부호를 쓸 수 있다.
하지만 부분적으로 안되는 부호 (특히 <)들이 있다.
이런 것들을 일일이 찾아서 작성해도 무의미하다 싶어서 작성하지 않겠다.
그냥 부호를 쓸 때는 (())를 사용하자.



2. 예제

예제1. if [ ] 사용 예제

#!/bin/bash

if [ $# -lt 1 ]; then
        echo "need at least on argument!"
elif [ $1 -ge 0 ] && [ $1 -lt 3 ]; then
        echo "0 <= ${1} < 3"
elif [ $1 -le 100 ]; then
        echo "smaller or equal to 100"
elif [ $1 -gt 100 ]; then
        echo "bigger then 100"
fi

예제2. if(( )) 사용 예제

#!/bin/bash

if (( $# < 1 )); then
        echo "need at least on argument!"
elif (( $1 >= 0 )) && (( $1 < 3 )); then
        echo "0 <= ${1} < 3"
elif (( $1 <= 100 )); then
        echo "smaller or equal to 100"
elif (( $1 > 100 )); then
        echo "bigger then 100"
fi

실행

[dailyCode@myComp:some]$ ./07.sh 102
bigger then 100

[dailyCode@myComp:some]$ ./07.sh 99
smaller or equal to 100

[dailyCode@myComp:some]$ ./07.sh 2
0 <= 2 < 3

[dailyCode@myComp:some]$ ./07.sh 1
0 <= 1 < 3

[dailyCode@myComp:some]$ ./07.sh
need at least on argument!




📌 문자 비교 테스트


1. [ ], [[ ]]에서 사용되는 부호

[ ]설명[[ ]]
=같은 지 확인== , =
!=같지 않은지 확인!=
>더 큰지 확인> , >
\<더 작은지 확인\< , <
-n str문자열이 비었는지 확인-n str
-z str문자열이 NULL 또는 길이가 0인지 검토-z str



2. [[ ]]으로만 가능한 연산법

[[ ]]설명
$var1 =~ var2var1 에 var2 에 있는 문자열 포함 여부
$var1 == var2*var1 이후 길이 상관 없이 var2 포함여부
$var1 == var2?var1 이후 문자 임의의 문자 한개 존재 여부
  • 현재는 좌측 피연산자에 $를 붙여서 변수를 사용하지만, $ 없이 쓸 수도 있다.
    다만 이때는 변수가 아니라 일반 문자열로 쓰인다.

  • 간단하게 [[ "hello world" == hello* ]] && echo YES || echo NO



3. 예제

3-1. 로그인 요청 예제

#!/bin/bash

read -p "Login : " login
read -p "Password : " -s password

echo ""

if [ $login = somebody ]; then
        if [ $password = somebody ]; then
                echo "환영합니다!"
        else
                echo "비밀번호가 틀렸습니다!"
        fi
else
        echo "아이디가 존재하지 않습니다"
fi

실행

[dailyCode@myComp:~]$ ./test.sh
Login : somebody
Password :
환영합니다!



4. [[ ]]의 정규식 비교

[[]][] 와 달리 정규식 비교도 가능하다.
간단한 예제를 작성하고 실행해서 확인만 하자.


예제 스크립트

#!/bin/bash

read -p "등록할 비밀번호를 입력해주세요:  " pwd

if [ -z $pwd ] || [ ${#pwd} -lt 8 ]; then
        echo "비밀번호는 반드시 8자 이상이어야 합니다." >&2
        exit 1
fi

if [[ $pwd =~ [0-9]+ ]]; then
        if [[ $pwd =~ [A-Z]+ ]]; then
                if [[ $pwd =~ [a-z]+ ]]; then
                        echo PASSWORD=$pwd
                else
                        echo "비밀번호는 영어 소문자를 포함해야 합니다" >&2
                        exit 1
                fi
        else
                echo "비밀번호는 영어 대문자를 포함해야 합니다" >&2
                exit 1
        fi
else
        echo "비밀번호는 0~9까지의 숫자를 하나 포함해야 합니다" >&2
        exit 1
fi

실행

[dailycode@myComp:lab]$ ./test.sh
등록할 비밀번호를 입력해주세요:  123
비밀번호는 반드시 8자 이상이어야 합니다.

[dailycode@myComp:lab]$ ./test.sh
등록할 비밀번호를 입력해주세요:  pgsd123452
비밀번호는 영어 대문자를 포함해야 합니다

[dailycode@myComp:lab]$ ./test.sh
등록할 비밀번호를 입력해주세요:  pgsEsdf1234
PASSWORD=pgsEsdf1234



📌 파일 비교 테스트

1. 사용하는 부호

문법설명
-d file파일이 존재하고 디렉토리인지 테스트
-e file파일이 존재하는지 테스트
-f file파일이 존재하고 일반 파일인지 테스트
-h, -L file파일이 심볼릭 링크인지 테스트
-b file파일이 블록 디바이스 파일인지 테스트
-c file파일이 캐릭터 디바이스 파일인지 테스트
-p file파일이 pipe인지 테스트
-s file파일이 존재하고 비어 있지 않은지 테스트
-r file파일이 존재하고 read를 할 수 있는지 테스트
-w file파일이 존재하고 write을 할 수 있는지 테스트
-x file파일이 존재하고 execute를 할 수 있는지 테스트
-O file파일이 존재하고 현재 사용자가 작성(소유)한 것인지 테스트
-G file파일이 존재하고 기본 그룹이 현재 사용자와 같은지 테스트
-k file파일에 sticky bit가 설정되어 있는지 테스트
-g file파일에 setuid bit 가 설정되어 있는지 테스트
-t fd파일 디스크립터 fd 가 열러있는지 테스트
file1 -nt file2file1 이 file2 보다 최근 생성되었는지 테스트
file1 -ot file2file1 이 file2 보다 오래된 것인지 테스트

2. 예제

2-1. .sh 로 끝나는 파일 찾아내기

#!/bin/bash

read -p "파일 이름을 입력하세요: " filename

if [ -e $filename ]; then
        echo "$filename file exists!"
        if [ -f $filename ]; then
                echo "this file is normal file"
        fi
        if [ -x $filename  ];then # 파일존재 여부 +  실행가능한 파일인지도 확인
                echo "this file is executable!"
        fi
        if [ -s $filename ]; then # 파일존재 여부 + 내용물이 있는지 확인
                echo "this file has some contents!"
        fi
else
        echo "no such file exists!"
fi

실헹

[dailycode@myComp:lab]$ ./test.sh
파일 이름을 입력하세요: e.sh
e.sh file exists!
this file is normal file
this file is executable!
this file has some contents!

[dailycode@myComp:lab]$ touch wow.txt
[dailycode@myComp:lab]$ ./test.sh
파일 이름을 입력하세요: wow.txt
wow.txt file exists!
this file is normal file





✨ 참고

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글