이 한 기능을 배우는 것은 Bash의 기능 중 큰 부분을 다루는 것을 의미합니다.
리눅스에서 스크립트를 배우는 것을 고민하고 있나요? 아마 서비스를 만들거나 무언가를 자동화하고 싶었지만, Bash가 너무 어렵다고 생각했을 수도 있습니다. if-문은 스크립트가 작동하는 방식의 큰 부분을 차지하지만, 한 시간 만에 배울 수 있습니다. 그 지식은 리눅스에서 많은 새롭고 강력한 옵션을 열어주기 때문에 시간을 들여 배우는 것이 가치가 있습니다.
Bash를 능숙하게 배우기 위해서는 몇 가지 필수적인 것만 있으면 되며, 그것만으로도 매우 멀리 나아갈 수 있습니다. 변수, 함수, 인수 처리, 그리고 if 문. 이것들이 기본적인 기둥이며, 오늘은 후자를 다루겠습니다.
Bash에서 if 문이란 무엇인가요?
질문을 처리하고 프로그램 흐름을 제어하는 수단
간단히 말하면, 그것은 질문에 답하는 수단입니다. 스크립트는 결정을 내리고, 이러한 질문들을 처리함으로써 그 안에서의 경로가 결정됩니다. 길에서의 각 갈림길은 브랜치라고 불리며, 질문 자체는 조건이라고 합니다.
바로 시작해서 간단한 예를 살펴봅시다:
# Compare non-numerical values
if [[ "foo" == "foo" ]]; then
echo "Foo equals foo"
fi
# Compare numbers
if (( 1 == 1 )); then
echo "One equals one"
fi- "=="는 비교 연산자(같음)입니다
A == B는 조건(질문)입니다- "echo"는 조건이 참일 때 메시지를 출력합니다
- "fi"는 if-문을 종료합니다
이 전체 문장은 두 값을 비교한 다음(참으로 평가됨) 메시지를 표시합니다.
숫자와 단어(즉, 문자열)가 서로 다른 괄호 유형을 사용하는 것을 주목해 보세요. 소괄호(예: ((...)))는 숫자용입니다; [[ ... ]]는 일반적으로 그렇지 않습니다(자세한 내용은 다음에).
조건 만들기
질문을 큰따옴표 두 개 안에 넣으세요
"1 == 1"는 식(expression)이라고 불리며, 이는 값으로 평가된다는 것을 의미합니다. 예를 들어, 1 + 1은 2로 평가되고, 1 == 1은 true로 평가됩니다.
Bash에서 표현식을 만드는 방법은 여러 가지가 있으며, if 문에서는 주로 비교 연산자(예: "==" 또는 ">")를 사용합니다. 다음은 몇 가지 구체적인 예입니다.
운영자 | 평가 결과 | 설명 |
|---|---|---|
|
| A는 B와 같다 |
|
| A는 B와 같다 |
|
| A는 B와 같지 않다 |
|
| A가 B보다 크다 |
|
| A가 B보다 작다 |
|
| A는 B 이하이다 |
|
| A는 B 이상이다 |
Bash에서 조건은 숫자(즉 종료 상태)로 평가됩니다: "0"은 true이고 0이 아닌 값은 false입니다. 명확하게 하기 위해 true와 false를 사용할 것입니다.
괄호 ((( ... )))와 대괄호 ([[ ... ]])는 비교 연산자를 다르게 처리합니다:
- 대괄호의 경우: 숫자를 비교하려면
-eq,-gt,-lt,-ge,-le를 사용하세요. 문자열을 비교하려면==,>,<를 사용하세요. - 괄호용: 숫자를 비교할 때
==,>,<,<=를 사용하세요. 문자열은 절대 비교하지 마세요.
문자 형식(e.g., -gt)을 괄호 표기법(e.g., (( a > b )))에 사용된 기호와 비교할 때, 이것이 의미하는 바는 다음과 같습니다:
기호 | 편지 | 설명 |
|---|---|---|
| | 같은 |
| | 같지 않음 |
| | 보다 큰 |
| | 보다 적은 |
| | 보다 크거나 같다 |
| | 작거나 같다 |
이것들은 이중 괄호 표기법과 함께 그것들을 사용하는 세 가지 유효한 방법입니다:
# Compare strings
if [[ "foo" == "foo" ]]; then
echo "They're equal"
fi
# Compare numbers
if (( 2 >= 1 )); then
echo "Two is greater than or equal to one"
fi
# Compare numbers using square brackets
if [[ 2 -ge 1 ]]; then
echo "Two is greater than or equal to one"
fi여러 조건 만들기
논리 연산자를 사용하여 조건을 연결하세요
괄호 안에서는 여러 조건을 평가하기 위해 논리 연산자를 사용할 수 있습니다:
# "&&" means "and"
if (( 1 == 1 && 2 == 2 )); then
echo "Both conditions are true"
fi
# "||" means "or"
if (( 1 == 1 || 2 == 2 )); then
echo "At least one condition is true"
fi
'&&'와 '||'는 영어 레이블인 'and'와 'or'처럼 작동합니다. 예를 들어, 1은 1과 같고 2는 2와 같을 때—둘 다 참이면 전체 문장은 참입니다.
이해를 단순화하기 위해, 이 진리표는 지정된 논리 연산자를 사용하여 모든 결과를 포착합니다:
A | B | | |
|---|---|---|---|
| | | |
| | | |
| | | |
| | | |
첫 번째 행을 보세요: "A"가 true이고 "B"가 true일 때, 표현식 A && B는 true입니다. 여기서 A && B는 true && true를 쓰는 것과 같습니다.
요약하면, 이러한 표현들이 참이 되려면:
&&: 둘 다 참이어야 합니다||: 적어도 하나는 참이어야 합니다
다른 모든 조건은 거짓입니다.
세 번째 연산자 "!"는 조건을 뒤집습니다. true를 false로, false를 true로 바꿉니다:
if ! (( 1 == 1 )); then
echo "This never prints"
fi예상대로 작동하게 하려면, "!"를 괄호 밖에 두세요.
Bash는 먼저 대괄호 안의 모든 것을 평가한 다음, 결과를 부정합니다.
단일 괄호 대 이중 괄호 표기법
이중 괄호 표기법은 현대적이며 더 강력하다
Bash if문을 작성하는 방법에는 두 가지가 있습니다(단일 괄호와 이중 괄호).
if [[ ... ]]; then
...
fi
if [ ... ]; then
...
fi- 이중 대괄호: Bash를 포함한 몇몇 셸에서 작동하는 더 새롭고 강력한 방식
- 단일 대괄호: POSIX를 준수하기 때문에 다양한 셸에서 작동하는 오래되고 덜 강력한 방법
저는 대부분의 리눅스 시스템이 Bash 셸을 포함하고 있기 때문에 이중 대괄호 표기법을 추천합니다. 제가 리눅스를 사용하면서 Bash 스크립트를 실행하는 데 단 한 번도 문제를 겪은 적이 없습니다. 아마도 Alpine Docker 컨테이너(ash가 포함된 경우)를 사용한다면 다를 수 있지만, 그뿐입니다. 스크립트 상단에 #!/bin/bash 셰뱅을 추가하면 Bash에서만 실행됩니다.
논리 연산자를 처리하는 방식에는 약간의 차이가 있습니다:
if [[ 20 -ge 18 && 20 -lt 65 ]]; then
echo "Working age"
fi
if [ 20 -ge 18 ] && [ 20 -lt 65 ]; then
echo "Working age"
fi더블 브래킷 표기법은 또한 정규 표현식 비교(=~)와 같은 기능도 가능하게 하며, 단어를 나누지 않습니다. 이것들은 고급 주제이므로 불편하다면 건너뛰세요.
여러 지점 캡처하기
모든 가능한 질문에 답하기 위해 if-else와 if-elif-else를 사용하세요
여러 분기를 처리해야 할 가능성이 거의 확실합니다. 그렇게 하려면 if-else 문을 사용하세요:
if (( 2 > 1 )); then
echo "Two is greater than one"
else
echo "Two is not greater than one"
fi더 많은 분기를 추가하려면 필요한 만큼 많은 "elif" 줄을 추가하세요:
if (( 1 > 2 )); then
echo "One is greater than two"
elif (( 1 == 2 )); then
echo "One equals two"
else
echo "One is less than two"
fi프로그램 상태 캡처
대괄호 없이 명령을 사용하여 프로그램 흐름을 제어하세요
Bash를 스크립팅에 사용해야 하는 한 가지 큰 이유는 종료 상태를 깔끔하게 처리하는 방법입니다. 프로그램이 실패하면 0이 아닌 종료 코드를 반환하고, 성공하면 0을 반환합니다. 우리는 괄호를 생략함으로써 이를 직접적으로 처리할 수 있습니다:
if grep -q "root" /etc/passwd; then
echo "Found the root user"
else
echo "No root user found"
fi우리는 Bash if문에 대해 상당한 진전을 이루었고, 여기서 배운 것들은 여러분을 크게 도울 것입니다. 이미 언급했듯이, 이것들은 스크립트 작동 방식의 큰 부분이므로 투자한 시간은 충분히 가치가 있습니다.
자세한 학습을 위해 공식 Bash 매뉴얼로 안내하겠습니다. 내용이 방대하므로 처음부터 끝까지 다 읽는 것은 추천하지 않지만, 세부 사항을 참고용으로 사용하는 것이 좋습니다.






