🏷️조건문
- 셸 스크립트에도 타 프로그래밍 언어처럼 조건문이 존재한다.
- if문과 case문으로 나눌 수 있는데, if문을 가장 많이 사용한다.
📌if문
if [ 조건식 ]
then
수행문
elif [ 조건식 ]
then
수행문
else
수행문
fi
- 조건식은
[ ]로 감싼다.
- 이때
[는 명령어기 때문에, [와 조건식 사이에 반드시 한 칸의 공백을 둬야한다.
- 즉,
[뒤에 조건식과 ]는 모두 [명령어의 실행인자가 되는 셈이다.
- 셸 스크립트에서
;(세미콜론)은 문법이나 명령어 또는 구문이 완료되어 다음 줄로 넘길 때 사용한다.
- 따라서
;을 사용할 경우, if [ 조건식 ]; then으로 한줄에 작성하는 것이 가능하다.
- 그러나 가독성 때문에 그닥 추천하지 않는다.
- 조건이 참이면
then 이후에 적힌 수행문을 수행한다.
fi는 if를 거꾸로 쓴 것으로, 조건문 마지막에 온다.
elif와 else는 생략 가능하다.
- 다음은 가장 간단한 구조인 if 조건문 예시다.
#!/bin/sh
a=10
if [ $a = 10 ]
then
echo "a is 10"
fi
#!/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
값) 수행문 ;; 과 같이 값과 수행문을 한줄에 써도 된다.
esac은 case를 거꾸로 한 것으로, 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 > 문자열2 | ASCII코드값을 비교해서, 문자열1이 크면 참 |
| 문자열1 < 문자열2 | ASCII코드값을 비교해서, 문자열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를 사용하는 것을 추천한다.
&&와 ||는 식이 복잡해질 경우, [[ ]](이중 대괄호)나 (( ))(이중 소괄호)를 사용해야 하는데 굉장히 복잡해지기 때문이다.