콘텐츠로 이동

Bash - 테스트


목적: 이 문서에서는 다음을 수행하는 방법에 대해 알아볼 것 입니다:

✔ 반환 코드 작업하기 ✔ 파일 테스트 및 비교 ✔ 테스트 변수, 문자열 및 정수 ✔ 숫자 정수로 작업을 수행

🏁 linux, 스크립트, bash, 변수

지식: ⭐ ⭐
복잡성: ⭐ ⭐ ⭐

소요 시간: 10분


셸에서 실행된 모든 명령은 실행 후 반환 코드(상태 또는 종료 코드)를 반환합니다.

  • 명령이 올바르게 실행된 경우, 일반적으로 상태 코드는 0입니다.
  • 명령 실행 중에 문제가 발생한 경우, 상태 코드는 0이 아닌 값을 갖습니다. 여기에는 액세스 권한 부족, 파일 누락, 잘못된 입력 등 여러 가지 이유가 있습니다.

개발자가 제공하는 반환 코드의 다른 값을 알고 싶다면 man 명령의 매뉴얼을 참조해야 합니다.

반환 코드는 직접 볼 수 없지만 $?라는 특수 변수에 저장됩니다.

mkdir directory
echo $?
0
mkdir /directory
mkdir: unable to create directory
echo $?
1
command_that_does_not_exist
command_that_does_not_exist: command not found
echo $?
127

!!! !!!

`echo` 명령과 함께 `$?` 변수의 내용 표시는 평가하려는 명령 직후에 수행됩니다. 이 변수는 명령, 명령줄 또는 스크립트를 실행할 때마다 업데이트되기 때문입니다.

$?의 값은 명령어를 실행할 때마다 바뀌기 때문에 테스트나 메시지 출력을 위해 나중에 사용할 변수에 그 값을 넣어두는 것이 좋습니다.

ls no_file
ls: cannot access 'no_file': No such file or directory
result=$?
echo $?
0
echo $result
2

스크립트에서 반환 코드를 생성하는 것도 가능합니다. 이렇게 하려면 exit 명령에 숫자 인수를 추가하기만 하면 됩니다.

bash # to avoid being disconnected after the "exit 2
exit 123
echo $?
123

명령의 올바른 실행 외에도 셸은 많은 패턴에 대해 테스트를 실행할 수 있는 기능을 제공합니다:

  • 파일: 존재, 유형, 권한, 비교;
  • 문자열: 길이, 비교;
  • 숫자 정수: 값, 비교.

테스트 결과:

  • $?=0 : 테스트가 올바르게 실행되고 참입니다.
  • $?=1 : 테스트가 올바르게 실행되고 거짓입니다.
  • $?=2 : 테스트가 올바르게 실행되지 않았습니다.

파일 유형 테스트

파일에 대한 test 명령 구문:

test [-d|-e|-f|-L] file

또는

[ -d|-e|-f|-L file ]

참고사항

[ 뒤와 ] 앞에 공백이 있음에 유의하십시오.

파일에 대한 test 명령의 옵션:

옵션 설명
-e 파일이 존재하는지 테스트합니다.
-f 파일이 존재하고 일반 유형인지 테스트합니다.
-d 파일이 존재하고 디렉토리 유형인지 확인합니다.
-L 파일이 존재하고 심볼릭 링크 유형인지 확인합니다.
-b 파일이 존재하고 특수 유형 블록 모드인지 확인합니다.
-c 파일이 존재하고 특수 유형 문자 모드인지 확인합니다.
-p 파일이 존재하고 파이프 유형인지 확인합니다.
-S 파일이 존재하고 소켓 유형인지 확인합니다.
-t 파일이 존재하고 터미널 유형인지 확인합니다.
-r 파일이 존재하고 읽을 수 있는지 확인
-w 파일이 존재하고 쓰기 가능한지 확인합니다.
-x 파일이 존재하고 실행 가능한지 확인합니다.
-g 파일이 존재하고 SGID가 설정되어 있는지 확인합니다.
-u 파일이 존재하고 SUID가 설정되어 있는지 확인합니다.
-s 파일이 존재하고 비어 있지 않은지 테스트합니다(크기 > 0바이트).

예시:

test -e /etc/passwd
echo $?
0
[ -w /etc/passwd ]
echo $?
1

더 현대적이고 외부 명령 test보다 더 많은 기능을 제공하는 일부 셸(bash 포함)에 대한 내부 명령이 생성되었습니다.

[[ -s /etc/passwd ]]
echo $?
1

참고사항

따라서 이 장의 나머지 부분에서는 내부 명령어를 사용할 것입니다.

두 파일 비교

두 문자열을 비교하는 것도 가능합니다:

[[ file1 -nt|-ot|-ef file2 ]]
옵션 설명
-nt 첫 번째 파일이 두 번째 파일보다 최신인지 테스트
-ot 첫 번째 파일이 두 번째 파일보다 오래된지 테스트합니다.
-ef 첫 번째 파일이 두 번째 파일의 물리적 링크인지 테스트

테스트 변수

변수를 테스트하는 것도 가능합니다:

[[ -z|-n $variable ]]
옵션 설명
-z 변수가 비어 있는지 테스트
-n 변수가 비어 있지 않은지 테스트

문자열 테스트

두 파일을 비교하는 것도 가능합니다:

[[ string1 =|!=|<|> string2 ]]

예시:

[[ "$var" = "Rocky rocks!" ]]
echo $?
0
옵션 설명
= 첫 번째 문자열이 두 번째 문자열과 같은지 테스트합니다.
!= 첫 번째 문자열이 두 번째 문자열과 다른지 테스트합니다.
< ASCII 순서에서 첫 번째 문자열이 두 번째 문자열 앞에 있는지 테스트합니다.
> 첫 번째 문자열이 ASCII 순서로 두 번째 문자열 뒤에 있는지 테스트합니다.

정수의 비교

정수 테스트 구문:

[[ "num1" -eq|-ne|-gt|-lt "num2" ]]

예시:

var=1
[[ "$var" -eq "1" ]]
echo $?
0
var=2
[[ "$var" -eq "1" ]]
echo $?
1
옵션 설명
-eq 첫 번째 숫자가 두 번째 숫자와 같은지 테스트
-ne 첫 번째 숫자가 두 번째 숫자와 다른지 테스트
-gt 첫 번째 숫자가 두 번째 숫자보다 큰지 테스트
-lt 첫 번째 숫자가 두 번째보다 작은지 테스트

참고사항

숫자 값은 쉘에서 일반 문자(또는 문자열)로 처리되기 때문에 문자에 대한 테스트는 숫자로 처리되는지 여부에 관계없이 동일한 결과를 반환할 수 있습니다.

test "1" = "1"
echo $?
0
test "1" -eq "1"
echo $?
0

하지만 테스트의 결과는 다른 의미를 가지지 않습니다:

  • 첫 번째 경우, 두 문자가 ASCII 테이블에서 동일한 값을 갖는다는 의미입니다.
  • 두 번째 경우, 두 숫자가 동일함을 의미합니다.

결합된 테스트

테스트의 조합을 통해 여러 개의 테스트를 한 번에 수행할 수 있습니다. 동일한 인수(파일, 문자열 또는 숫자)를 여러 번 또는 다른 인수를 테스트하는 것이 가능합니다.

[ option1 argument1 [-a|-o] option2 argument 2 ]
ls -lad /etc
drwxr-xr-x 142 root root 12288 sept. 20 09:25 /etc
[ -d /etc -a -x /etc ]
echo $?
0
옵션 설명
-a AND: 모든 패턴이 참이면 테스트가 참이 됩니다.
-o OR: 적어도 하나의 패턴이 참이면 테스트가 참이 됩니다.

내부 명령어를 사용할 때, 다음과 같은 구문을 사용하는 것이 좋습니다:

[[ -d "/etc" && -x "/etc" ]]

테스트는 괄호 ( )를 사용하여 우선 순위를 지정하여 그룹화할 수 있습니다.

(TEST1 -a TEST2) -a TEST3

옵션에 의해 요청된 테스트의 반대 테스트를 수행하기 위해 ! 문자를 사용합니다:

test -e /file # true if file exists
! test -e /file # true if file does not exist

숫자 연산

expr 명령어를 사용하여 숫자 정수로 연산을 수행합니다.

expr num1 [+] [-] [\*] [/] [%] num2

예시:

expr 2 + 2
4

주의

연산 기호를 공백으로 둘러싸는 것에 주의하십시오. 빠트린 경우 오류 메시지가 표시됩니다. 곱셈의 경우 잘못된 해석을 피하기 위해 와일드카드 문자 * 앞에 \가 옵니다.

옵션 설명
+ 덧셈
- 뺄셈
\* 곱셈
/ 나눗셈 몫
% 나눗셈 모듈로

typeset 명령

typeset -i 명령은 변수를 정수로 선언합니다.

예시:

typeset -i var1
var1=1+1
var2=1+1
echo $var1
2
echo $var2
1+1

let 명령

let 명령은 문자가 숫자인지 테스트합니다.

예시:

var1="10"
var2="AA"
let $var1
echo $?
0
let $var2
echo $?
1

주의

let 명령은 숫자 0을 평가할 때 일관된 반환 코드를 반환하지 않습니다.

let 0
echo $?
1

let 명령을 사용하면 수학 연산도 수행할 수 있습니다.

let var=5+5
echo $var
10

let$(( ))로 대체될 수 있습니다.

echo $((5+2))
7
echo $((5*2))
10
var=$((5*3))
echo $var
15

Author: Antoine Le Morvan

Contributors: Steven Spencer