Bash:Test
테스트 (Test Constructs).
- if/then 은 명령어 목록의 종료 상태가 0 (유닉스 관례상 0은 "성공"을 나타내므로)인지 테스트를 해보고 맞다면 다음 명령어들을 실행시킵니다.
- 테스트 전용 명령어로
[
(왼쪽 대괄호 특수 문자)란 것이 있습니다. test명령어와 동의어이고, 효율적인 이유로 내장 명령입니다. 이 명령어는 자신의 인자를 비교식이나 파일 테스트로 인식해 해당 연산의 결과에 따른 종료 상태(참은 0, 거짓은 1)를 리턴합니다. - 또한, 다른 언어를 쓰던 프로그래머에게 어느 정도 더 친숙한 비교 연산을 제공해 주는
[[ ... ]]
를 Bash 2.02 버전부터 제공합니다. 주의할 점은[[
가 명령어가 아닌 키워드라는 것입니다. - Bash 는
[[ $a -lt $b ]]
를 종료 상태를 리턴하는 하나의 요소로 이해합니다.
Operator
다음 조건이 맞다면 참을 리턴
-
-e
: 존재하는 파일 -
-f
: 보통 파일(디렉토리나 디바이스 파일이 아님) -
-s
: 파일 크기가 0 이 아님 -
-d
: 파일이 디렉토리 -
-b
: 파일이 블럭 디바이스(플로피나 시디롬 등등) -
-c
: 파일이 문자 디바이스(키보드, 모뎀, 사운드 카드 등등) -
-p
: 파일이 파이프 -
-h
: 파일이 심볼릭 링크 -
-L
: 파일이 심볼릭 링크 -
-S
: 파일이 소켓 -
-t
: 파일 디스크립터가 터미널 디바이스와 연관이 있음. 스크립트의 표준입력([ -t 0 ]
)이나 표준출력([ -t 1 ]
)이 터미널인지 아닌지를 확인하는데 쓸 수 있습니다. -
-r
: 테스트를 돌리는 사용자가 읽기 퍼미션을 갖고 있음 -
-w
: 테스트를 돌리는 사용자가 쓰기 퍼미션을 갖고 있음 -
-x
: 테스트를 돌리는 사용자가 실행 퍼미션을 갖고 있음 -
-g
: 파일이나 디렉토리에 set-group-id(sgid) 플래그가 세트되어 있음 -
-u
: 파일에 set-user-id(suid) 플래그가 세트되어 있음 -
-k
: 스티키 비트(sticky bit)가 세트 -
-O
: 자신이 소유자임 -
-G
: 그룹 아이디가 자신과 같음 -
-N
: 마지막으로 읽힌 후에 변경 됐음 -
f1 -nt f2
: f1 파일이 f2 파일보다 최신임 -
f1 -ot f2
: f1 파일이 f2 파일보다 예전것임 -
f1 -ef f2
: f1 파일과 f2 파일이 같은 파일을 하드 링크하고 있음 -
!
: 부정. -
-n
: 문자열 길이가 0이 아닌 경우. -
-z
: 문자열 길이가 0인 경우.
[ vs [[
-
[[ ]]
는 쉘 상에서[ ]
과 동일합니다. 이 명령어는 ksh88에서 따 온 확장 테스트 명령어입니다. -
[[
과]]
사이에서는 파일명 확장이나 낱말 조각남이 일어나지 않지만 매개변수 확장이나 명령어 치환은 일어납니다. -
[ ... ]
말고[[ ... ]]
를 쓰면 많은 논리적 에러들을 막을 수 있습니다. 예를 들어&&
,||
,<
,>
연산자들은[ ]
에서 에러를 내지만[[ ]]
에서는 잘 동작합니다.
대괄호 두개를 쓸 경우 또 한가지 장점은, 조건식이 두개 이상 있어서 AND/OR 연산을 할 때 보기가 좀 더 편하다는 것이다.
num=1
name="john"
# 조건식: num=1 AND name="john"
if [ $num -eq 1 -a $name = "john" ]
then echo "$num: $name"
fi
# 대괄호 두개 사용
if [[ $num -eq 1 ]] && [[ $name = "john" ]]
then echo "$num: $name"
fi
((
-
(( ... ))
와let ...
은 자신이 계산한 산술식이 0이 아닌 값을 가질 경우에 종료 상태 0을 리턴합니다. 따라서, 이런 산술 확장은 산술 비교를 할 때 쓸 수 있습니다.
Check broken symlink
# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
# code if the symlink is broken
fi