우분투 Bash 쉘스크립트 작성 시 if 문 내에서 연산자 ( ==, <  등)을 사용할 때 No such file or directory 오류가 나는 경우에 해결방법은 아래와 같다.

 

□ 사례

text.sh

var=100
if [ $var < 200 ]; then
     ... ...

else 
     ... ...
fi

 

실행 결과 

$ bash test.sh
test.sh: line 3: 200: No such file or directory

 

bash 쉘(POSIX 쉘) 가이드에 따르면 하기와 같이 "<" 연산자 대신 "-lt"로 수정해야 제대로 동작한다.

[ "$var" -lt 200 ]

 

각 사용법은 하기와 같다.

 

□ POSIX 쉘 가이드 : 상황별 "<" 연산자 사용 방법

   - ※ [   공백   "$var"   -lt   200   공백   ] 처럼 '공백' 이 있어야 한다.

문법 대상 (상황) 주의 사항
[ "$var" -lt 200 ] 숫자 비교 POSIX shell 전체
[ "$var" \< 200 ] 문자 비교 POSIX shell 전체
[[ $var -lt 200 ]] 문자 비교 bash, ksh 에서만 동작
(( $var -lt 200 )) 숫자 비교 bash, ksh 에서만 동작
(( var < 200 )) 숫자 비교, var를 $ 없이도 변수로 인식함 bash, ksh 에서만 동작

 

 

□ 참고

비교 연산자 사용법 의미
== [ $A == $B ] 같다
!= [ $A != $B ] 같지 않다
> [ $A > $B ] 크다
>= [ $A >= $B ] 크거나 같다
< [ $A < $B ] 작다
<= [ $A <= $B ] 작거나 같다
&& [ $A && $B ] 논리연산 AND, 둘 다 모두 True 이면 True
|| [ $A || $B ] 논리연산 OR, 둘 중 하나가 True 이면 True

 

비교식 사용법 약어 유래 의미 비고
-z [ -z $A ]   공백이면 True $A == ""
-n [ -n $A ]   공백이 아니면  True $A != ""
-eq [ $A -eq $B ] equal to 같다 $A == $B
-ne [ $A -ne $B ] not equal to 같지 않다 $A != $B
-ge [ $A -ge $B ] greater than or equal to 크거나 같다 $A >= $B
-gt [ $A -gt $B ] greater than  크다 $A > $B
-le [ $A -le $B ] less than or equal to 작거나 같다 $A <= $B
-lt [ $A -lt $B ] less than 작다 $A < $B
-a [ $A -a $B ]   논리연산 AND, $A, $B 모두 True이면 True $A && $B
-o [ -o $A ]   논리연산 OR,  $A, $B 중 하나가 True이면 True $A || $B

 

파일 비교 사용법 의미
-f [ -f $A ] 파일  (디렉토리나 다른 형태의 파일은 False)
-d 이하 동일 디렉토리
-L   심볼링 링크 
-r   사용자가 대상에 읽기 권한(read)을 가지고 있으면 True
-w   사용자가 대상에 쓰기 권한(write)을 가지고 있으면 True
-x   사용자가 대상에 쓰기 실행(execution)을 가지고 있으면 True
-s   파일 크기가 0 이 아니면 True
-S   소켓
-nt [ $A -nt $B] $A 파일이 $B 보다 최신이면 True
-ot [ $A -ot $B] $A 파일이 $B 보다 오래되면 True
-ef [ $A -ef $B] 동일 파일이면 True

 

반응형

'Linux' 카테고리의 다른 글

docker repository <none>  (0) 2024.10.04
모바텀(MobaXterm) 세션 죽는 현상 개선  (0) 2024.09.10
tar, tar.gz 압축 및 해제  (2) 2024.07.03
Docker 중단없이 나오기(Detach)  (2) 2024.02.25
Ubuntu 버전 확인  (0) 2024.02.24

+ Recent posts