🏷️조건문
- 셸 스크립트에도 타 프로그래밍 언어처럼 조건문이 존재한다.
- 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
를 사용하는 것을 추천한다.
&&
와 ||
는 식이 복잡해질 경우, [[ ]]
(이중 대괄호)나 (( ))
(이중 소괄호)를 사용해야 하는데 굉장히 복잡해지기 때문이다.