정확히는 bash 스크립트 디버깅 방법이다.

 

1. bash -n 스크립트파일

스크립트에 문법적 오류가 있는지 확인할 때 사용한다. 스크립트를 해석은 하지만, 실행하지는 않는다.

스크립트에 문법 오류가 있는 경우, 에러 내용을 출력해주고, 문법 오류가 없는 경우 아무런 메시지도 출력하지 않는다.

 

2. bash -x 스크립트파일

스크립트 전체를 디버깅하기 위해 일반적으로 사용되는 방법이다.

순서: 변수 치환 -> 실행되는 스크립트 각 라인 출력 -> 스크립트 실행결과 출력

실행되는 스크립트 각 라인 출력시 맨 앞에 "+" 기호가 붙는다.

 

3. 스크립트 내 set -x, set +x 사용

스크립트 중 일부분만 디버깅하기 위해 일반적으로 사용되는 방법이다.

스크립트 내 디버깅을 시작하고자 하는 부분에 set -x 를, 디버깅을 종료하고자 하는 부분에 set +x 를 삽입하고 일반적인 방법으로 스크립트를 실행하면 된다.

 

예시)

test.sh

#!/bin/bash

name="linux"
if [[ $name == "centos" ]]
then
        printf "Hello $name\n"
fi

set -x # 디버깅 시작지점
declare -i num=1
while (( num < 5 ))
do
        let num+=1
done
set +x # 디버깅 종료지점

printf "Total : %d\n" $num
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

조건문 사용시 정수 비교표현식을 많이 사용하는데, 이때 let과 test의 사용방법을 알아본다.

 

let은 (())와 같으며

test는 [[]]와 같다.

 

1. 스크립트 작성

test.sh

#!/bin/bash
x=5
y=7

(( x < y ))
echo $?

[[ x -lt y ]]
echo $?

 

2. 스크립트 실행

./test.sh

0
0

 

3. 정리

정수 비교연산시 let을 사용시에는 비교연산자로 기호(<, >, <=, >=, ==)를 사용하며,

test를 사용시에는 비교연산자로 비교문자(-lt, -gt, -le, -gt, -eq)를 사용하면 된다.

(이렇게 정리하는게 속편하다)

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

조건문을 사용할 때 문자열 비교 표현식 결과를 판단하기 위해서 싱글브라켓과 더블브라켓을 사용하는데, 그 차이를 정리한다.

참고로, 브라켓을 사용할 때는 시작 브라켓 다음에 반드시 공백이 있어야 한다. (문자열 비교시)싱글브라켓은 test와 같은 기능이다. "=" 와 "==" 는 둘다 동일비교이며, bash 버전에 따라 "=" 를 지원하지 않는다고 한다.(걍 문자열 비교는 무조건 == 를 쓰자) 표현식 판단결과가 0이면 true이며, 1이면 false이다.

참고로, "-eq" 는 문자열 비교시가 아니라 숫자 비교를 test를 사용하여 비교할 때 쓰는 비교문이다.

 

1. 테스트 스크립트

test.sh

#!/bin/bash
name=root

# 1. 정확한 문자열 매칭 테스트
# test, 싱글브라켓, 더블브라켓 모두 동일하다.
test $name = root
echo '$name = root >>> '$?

test $name == root
echo '$name == root >>> '$?

[ $name = root ]
echo '[ $name = root ] >>> '$?

[ $name == root ]
echo '[ $name == root ] >>> '$?

[[ $name = root ]]
echo '[[ $name = root ]] >>> '$?

[[ $name == root ]]
echo '[[ $name == root ]] >>> '$?



# 2. 패턴 매칭 테스트
# 싱글브라켓, test는 패턴매칭이 안된다.
# 더블브라켓은 패턴매칭이 된다.
test $name = [Rr]???
echo 'test $name = [Rr]??? >>> '$?

test $name == [Rr]???
echo 'test $name == [Rr]??? >>> '$?

[ $name = [Rr]??? ]
echo '[ $name = [Rr]??? ] >>> '$?

[ $name == [Rr]??? ]
echo '[ $name == [Rr]??? ] >>> '$?

[[ $name = [Rr]??? ]]
echo '[[ $name = [Rr]??? ]] >>> '$?

[[ $name == [Rr]??? ]]
echo '[[ $name == [Rr]??? ]] >>> '$?

 

2. 실행결과

./test.sh

$name = root >>> 0
$name == root >>> 0
[ $name = root ] >>> 0
[ $name == root ] >>> 0
[[ $name = root ]] >>> 0
[[ $name == root ]] >>> 0
test $name = [Rr]??? >>> 1
test $name == [Rr]??? >>> 1
[ $name = [Rr]??? ] >>> 1
[ $name == [Rr]??? ] >>> 1
[[ $name = [Rr]??? ]] >>> 0
[[ $name == [Rr]??? ]] >>> 0

 

3. 정리

test 명령어와 싱글브라켓은 기능이 동일하며, 더블브라켓은 패턴매칭까지 지원한다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,