조건문과 조건식

MySprtlty·2022년 7월 10일
0

Bash Shell Script

목록 보기
8/11
post-thumbnail

🏷️조건문

  • 셸 스크립트에도 타 프로그래밍 언어처럼 조건문이 존재한다.
  • if문과 case문으로 나눌 수 있는데, if문을 가장 많이 사용한다.

📌if문

  • if문의 구조는 다음과 같다.
if [ 조건식 ]
then
	수행문
elif [ 조건식 ]
then
	수행문
else
	수행문
fi
     
  • 조건식은 [ ]로 감싼다.
  • 이때 [는 명령어기 때문에, [와 조건식 사이에 반드시 한 칸의 공백을 둬야한다.
  • 즉, [뒤에 조건식과 ]는 모두 [명령어의 실행인자가 되는 셈이다.
  • 셸 스크립트에서 ;(세미콜론)은 문법이나 명령어 또는 구문이 완료되어 다음 줄로 넘길 때 사용한다.
    • 따라서 ;을 사용할 경우, if [ 조건식 ]; then으로 한줄에 작성하는 것이 가능하다.
    • 그러나 가독성 때문에 그닥 추천하지 않는다.
  • 조건이 참이면 then 이후에 적힌 수행문을 수행한다.
  • fiif를 거꾸로 쓴 것으로, 조건문 마지막에 온다.
  • elifelse는 생략 가능하다.
  • 다음은 가장 간단한 구조인 if 조건문 예시다.
#!/bin/sh

a=10

if [ $a = 10 ]
then
        echo "a is 10"
fi

  • 다음은 if-else 구조의 조건문 예시다.
#!/bin/sh

a=10

if [ $a = 10 ]
then
        echo "a is 10!"
else
        echo "a isn't 10!"
fi

  • 다음은 if-elif-else 구조의 조건문 예시다.
#!/bin/sh

a=$1

if [ $a -lt 10 ]
then
        echo "a is less than 10."
elif [ $a -gt 10 ]
then
        echo "a is greater than 10"
else
        echo "a is 10."
fi
  • sh test.sh 7, sh test.sh 10, sh test.sh 13으로 각각 실행인자를 바꿔서 실행해보자.

📌case문

  • 변수 값에 따라 조건을 분기하려면 case문을 사용하면 편하다.
  • if문에 비해서 사용 빈도가 떨어진다.
  • case문의 구조는 다음과 같다.
case $변수 in
	값1)
    수행문 ;;
    값2)
    수행문 ;;
    *)
    수행문 ;;
esac
  • 값) 수행문 ;; 과 같이 값과 수행문을 한줄에 써도 된다.
  • esaccase를 거꾸로 한 것으로, if문의 fi처럼 조건문 마지막에 온다.
  • *는 모든 문자열을 의미하는 와일드카드므로, 앞서 일치하는 케이스가 없을 때 수행하는 default문이 된다.
  • 다음은 case문을 사용한 예시 코드다.
#!/bin/sh

case $1 in
        Apple)
                echo "First Parameter is Apple" ;;
        Banana) echo "First Parameter is Banna" ;;
        *)
                echo "Something else" ;;
esac

🏷️조건식

  • 조건 판정에 [명령어 말고도, test명령어도 사용가능하다.
  • [명령어와 test명령어은 기능이 동일하다.
  • 다음은 [명령어와 test가 사용하는 연산자(옵션)를 정리한 것이다.

📌문자열 연산자

문자열 길이 연산자

옵션설명
-n 문자열문자열 길이가 0이 아니면 참 (non-zero)
-z 문자열문자열 길이가 0이면 참 (zero)
  • 문자열의 길이에 대해 판별하는 연산자다.
  • -z는, 변수의 초기화 유무를 판단할 때 요긴하게 쓰인다.

문자열 비교 연산자

옵션설명
문자열1 = 문자열2두 문자열이 같으면 참
문자열1 != 문자열2두 문자열이 다르면 참
문자열1 > 문자열2ASCII코드값을 비교해서, 문자열1이 크면 참
문자열1 < 문자열2ASCII코드값을 비교해서, 문자열1이 크면 참
  • 추가적으로 ASCII 코드값을 비교해서 판단하는 연산자가 존재한다.
  • ><를 사용할 경우, [ ]대신 [[ ]](이중 대괄호)를 사용해줘야 한다.

📌정수 비교 연산자

옵션설명
정수1 -eq 정수2값이 같으면 참 (equal)
정수1 -ne 정수2값이 다르면 참 (not equal)
정수1 -gt 정수2정수1 > 정수2면 참 (greater than)
정수1 -ge 정수2정수1 >= 정수2면 참 (greater than or equal)
정수1 -lt 정수2정수1 < 정수2면 참 (less than)
정수1 -le 정수2정수1 <= 정수2면 참 (less than or equal)
  • 🖇️cf) 위의 연산자들은 RISC-V assembly에서 사용하는 pseudo instruction mnemonic과 유사해서 암기하기 쉽다.
옵션설명
정수1 > 정수2-gt과 동일하다.
정수1 >= 정수2-ge와 동일하다.
정수1 < 정수2-lt와 동일하다.
정수1 <= 정수2-le와 동일하다.
  • 정수 비교 연산에서 ><를 사용할 경우, [ ]대신 (( ))(이중 소괄호)를 사용해야한다.
    • 🖇️cf) [[ ]](이중 대괄호)가 아님에 주의한다.

📌파일 연산자

옵션설명
-e 파일파일이 존재하면 참 (exist)
-f 파일일반 파일이면 참 (file)
-c 파일특수 디바이스 파일이면 참 (character)
-d 파일디렉터리면 참 (directory)
-L 파일심볼릭 링크면 참 (Link)
-r 파일읽기 가능하면 참 (read)
-w 파일쓰기 가능하면 참 (write)
-x 파일실행 가능하면 참 (execute)
-s 파일사이즈가 0보다 크면 참 (size)
-O 파일스크립트 실행 소유자와 파일의 소유자가 동일하면 참 (Owner)
-G 파일스크립트 실행 그룹과 파일의 그룹이 동일하면 참 (Group)
파일1 -nt 파일2파일1이 파일2보다 최신이면 참 (newer than)
파일1 -ot 파일2파일1이 파일2보다 오래됐으면 참 (older than)

📌논리 연산자

  • 논리 연산자를 사용하여 조건식을 합성식(compound expression)으로 만들 수 있다.
옵션설명
조건식1 -a 조건식2조건식1과 조건식2의 논리곱하여 합성식을 만든다. (and)
조건식1 -o 조건식2조건식1과 조건식2의 논리합하여 합성식을 만든다. (or)
[조건식1] && [조건식2]AND연산한다.
[조건식1] || [조건식2]OR연산한다.
  • 무조건 기호 연산자 보다는 -a-o를 사용하는 것을 추천한다.
    • &&||는 식이 복잡해질 경우, [[ ]](이중 대괄호)나 (( ))(이중 소괄호)를 사용해야 하는데 굉장히 복잡해지기 때문이다.
profile
2Co 4:7

0개의 댓글