변수 선언 시 = 기호 앞/뒤에는 공백이 없어야 한다.
변수를 사용할 때는 $ 기호 또는 ${}를 사용하며, 변수를 사용할 때는 큰 따옴표" 사이에 사용되는 것이 안전하다. 따옴표 없이 변수만 사용할 때는 공백이나 비어 있는 값으로 인해 문제가 발생할 수 있다.
#!/bin/bash # 변수 선언 name="Kim" # 출력 echo "hello $name." echo "hello ${name}."
if 조건문은 아래와 같은 문법을 지켜야 한다.
if, 종료는 fi를 작성해야 한다.[] 안에 작성해야 하며, 조건식 앞/뒤에 공백이 있어야 한다. 또한 조건식이 종료되면 세미콜론 ;으로 조건식을 종료하거나, 줄 바꿈을 해야 한다.then을 작성하여 다음 명령문을 작성할 수 있다.elif를 사용하며, 그 외 조건은 else를 사용한다.&&(and)연산자와 ||(or) 연산자를 사용하여 조건식을 결합할 수 있다.if문 기본 문법
#!/bin/bash if [ 조건식1 ]; then 명령문 elif [ 조건식2 ]; then 명령문 elif [ 조건식3 ] && [ 조건식4 ]; then 명령문 else 명령문 fi
배시 쉘 스크립트에서는 일반적으로 사용하는 부등호(<, > 등)을 사용할 수 없다. 리눅스에서 부등호는 이미 파일 리다이렉션(File Redirection)을 위한 기호로 사용되기 때문이다.
문자를 비교할 때는 부등호를 사용하여 사전적 순서를 비교할 수 있다. [["apple" < "banana"]]
하지만, 숫자를 비교할 때는 부등호를 사용할 수 없으며, 별도의 비교 연산자를 사용해야 한다.
문자열 비교
= : 두 문자열이 같은지 확인 == : 두 문자열이 같은지 확인 (=와 동일한 기능) != : 두 문자열이 다른지 확인 -z : 문자열이 null인지 확인, null이면 true -n : 문자열이 null이 아닌지 확인숫자 비교
= : 두 숫자가 같은지 확인 (추천X) -eq : 두 숫자가 같은지 확인 (n = m) -ne : 두 숫자가 다른지 확인 (n != m) -gt : 한 숫자가 다른 숫자보다 큰지 확인 (n > m) -ge : 한 숫자가 다른 숫자보다 크거나 같은지 확인 (n >= m) -lt : 한 숫자가 다른 숫자보다 작은지 확인 (n < m) -le : 한 숫자가 다른 숫자보다 작거나 같은지 확인 (n <= m)두 숫자가 같은지 비교하는 연산자는
=와-eq가 있다. Bash에서는 비교 대상이 숫자일 경우=를 숫자 비교로 자동 변환할 수 있지만, 명확한 코드 작성을 위해-eq를 사용하는 것이 좋다.예시
#!/bin/bash n=10 if [ "$n" -gt 20 ]; then echo "20 보다 크다." elif [ "$n" -lt 20 ]; then echo "20 보다 작다." elif [ "$n" -eq 20 ]; then echo "20이 맞다." else echo "모르겠다." fi
숫자, 문자 외에도 파일 확인 연산자도 존재한다.
-f : 지정한 파일이 존재하고, 일반 파일인지 확인 -d : 지정한 디렉토리가 존재하는지 확인 -s : 지정한 파일이 존재하고, 비어 있지 않은지 확인 -r : 지정한 파일이 존재하고, 읽을 수 있는지 확인 -w : 지정한 파일이 존재하고, 수정할 수 있는지 확인 -x : 지정한 파일이 존재하고, 실행할 수 있는지 확인
for 반복문은 아래와 같은 문법을 지켜야 한다.
for, 종료는 done를 작성해야 한다.{}안에 작성해야 하며, ..을 작성하여 범위를 지정한다.;으로 범위 지정을 종료하거나, 줄 바꿈을 해야 한다.do를 작성하여 다음 실행 명령문을 작성할 수 있다.반복 범위 지정
#!/bin/bash for i in {1..5}; do echo "번호: $i" done ----출력---- 번호: 1 번호: 2 번호: 3 번호: 4 번호: 5숫자/문자 나열
#!/bin/bash for i in "하나" 2 "셋" 4 "다섯"; do echo "번호: $i" done ----출력---- 번호: 하나 번호: 2 번호: 셋 번호: 4 번호: 다섯배열 순회
#!/bin/bash arr=("apple" "orange" "banana" "melon") for i in "${arr[@]}"; do echo "fruit: $i" done ----출력---- 과일: apple 과일: orange 과일: banana 과일: melon
while 반복문은 아래와 같은 문법을 지켜야 한다.
[] 안에 조건식을 작성하여 범위를 지정한다.;으로 범위 지정을 종료하거나, 줄 바꿈을 해야 한다.do를 작성하여 다음 실행 명령문을 작성할 수 있다.(()) 안에 식을 작성한다.✅ 수학적 계산식
쉘 스크립트에서 수학적 계산식은 이중 괄호
((계산식))에 작성해야 한다.괄호 없이 계산식을 작성할 경우, 해당 식을 명령문으로 인식하기 때문에 동작하지 않는다.
일반 괄호
()안에 작성할 때도 계산식으로 인식하지 않는다. 쉘 스크립트에서 일반 괄호는 서브 쉘, 배열 등에 사용되기 때문이다.#!/bin/bash n=1 while [ "$n" -lt 5 ]; do echo "번호: $n" ((n++)) #수학적 계산식 done ---- 출력 ---- 번호: 1 번호: 2 번호: 3 번호: 4
배시 쉘 스크립트에서 함수는 다음과 같은 문법과 특징을 가지고 있다.
function 키워드를 사용하여 함수를 정의할 수 있지만, 일반적으로 해당 키워드 사용 없이 함수명 뒤에 괄호()를 사용하여 함수를 정의하는 게 일반적이다.$1 ~ $n을 작성하여 사용한다.echo 또는 printf를 사용하여 반환해야 한다. 쉘 스크립트에서 return은 상태 코드(Exit Status)를 반환한다.() 사용 없이 사용된다. 함수명 작성 후 공백으로 인수 값을 작성한다.local 키워드를 사용하여 변수를 사용한다. local 키워드를 사용하면 함수 외부에서 해당 변수에 접근할 수 없다.함수 기본 문법
함수명() { # 명령문 } 함수명 # 함수 호출매개변수 및 인수 활용
함수 내부에 사용할 매개변수
$1 ~ $n을 작성하여 사용
함수 호출 시 인수는 함수명 작성 후 인수 값을 작성. 각 인수는 공백으로 구분.#!/bin/bash fnIntroduce(){ echo "내 이름은 $1이고, 나이는 $2살이야" } fnIntroduce "김철수" 5 ---- 출력 ----- 내 이름은 김철수이고, 나이는 5살이야함수 기본값 설정
기본값을 설정할 때는 지정할 인수 번호에 맞게
n:-<기본값>을 정의해야 한다.#!/bin/bash fnIntroduce(){ local defaultAge=${2:-100} echo "내 이름은 ${1:-"김아무개"}이고, 나이는 $defaultAge살이야" } fnIntroduce ---- 출력 ---- 내 이름은 김아무개이고, 나이는 100살이야팩토리얼 함수
#!/bin/bash fnFactorial(){ local result=1 for i in $(seq 1 $1); do result=$((result * i)) done echo $result } fnFactorial 5 ---- 출력 ---- 120
배시 쉘 스크립트에서는 에러 핸들링을 통해 스크립트 실행 중 발생하는 오류를 처리하고, 필요한 조치를 취할 수 있다.
배시 쉘 스크립트에서 set -e을 선언하면, 선언 위치를 기준으로 하단부에 에러 발생 시 스크립트가 종료된다.
#!/bin/bash set -e # 에러가 발생하면 스크립트 종료 echo "Start" # 실행 ls null_file.txt # 존재하지 않는 파일 출력 시도 -> 에러 발생 -> 에러 문구 출력 echo "End" # 실행X
배시 쉘 스크립트에서 마지막으로 실행된 명령어의 종료 상태 코드는 특수 변수 $?에 저장된다.
#!/bin/bash file="null_file.txt" ls $file 2>/dev/null # 표준 에러(2) 출력 날림(/dev/null). 즉, 에러 출력X if [ $? -ne 0 ]; then echo "에러 발생 파일이 없음!!" else echo "파일 존재!!" fi echo "스크립트 종료" # 실행
배시 쉘 스크립트에서 exit 명령어를 사용하여 종료 코드(exit code)를 지정하고, 명시적으로 스크립트를 종료할 수 있다.
exit 명령어 뒤에 정수 값을 지정하여 종료 상태 코드를 설정.
#!/bin/bash name="김철수" if [ ! $name == "신짱구" ]; then echo "에러발생 : 신짱구가 아닙니다!!" exit 1 # 종료 코드 지정 후 스크립트 종료 fi echo "김철수입니다." # 실행X