'-ge'를 사용한 배쉬 테스트 화장실 - 0으로 나누기 오류

'-ge'를 사용한 배쉬 테스트 화장실 - 0으로 나누기 오류

다음 스크립트에서는 오류가 발생합니다.

#!/bin/bash  
if [[ $(wc -l "/disk1/environment.sh") -ge 0 ]];then  
   echo "File has data"  
fi

line 2: [[: 5 /disk1/environment.sh: division by 0 (error token is "/environment.sh")

그러나 아래 코드는 잘 작동합니다.

#!/bin/bash  
  if [[ $(wc -l "/disk1/environment.sh") > 0 ]];then  
    echo "File has data"  
  fi

여기에서 "-ge"와 ">"가 왜 다르게 동작하는지 알려줄 수 있는 사람이 있나요?
배쉬 버전:GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

답변1

wc -l /filename이는 다음과 같이 출력되는 출력 때문입니다 .

5 /filename

하지만 정수 비교(연산자 -ge:)를 수행하고 있으므로 관련 없는 부분이 /filename유효하지 않아 오류 메시지가 발생합니다.

개수가 반환될 수 wc있도록 STDIN을 통해 파일 이름을 전달하기만 하면 됩니다 .wc

[[ $(wc -l </disk1/environment.sh) -ge 0 ]]

두 번째 경우에는 [[ $(wc -l /disk1/environment.sh) > 0 ]]명령 대체의 출력이 $(wc -l /disk1/environment.sh)사전순으로 정렬되어 있는지 확인하면 됩니다 0. wc이는 일부 오류가 반환되고 STDOUT에서 결과가 생성되지 않는 한 항상 그렇습니다.

, , , 같은 [[산술 연산자는 지원되지 않습니다. 다음 키워드가 필요합니다 .>>=<<=((

(( $(wc -l </disk1/environment.sh) > 0 ))

답변2

두 번째 시도에서는 오류가 발생하지 않지만 파일에 최소한 한 줄이 포함되어 있는지 테스트하려는 시도라고 가정하면 작동하지 않습니다.

출력은 wc -l "/disk1/environment.sh"파일의 줄 수, 공백 및 파일 이름으로 구성됩니다. 행 개수를 사용하려면 추출해야 합니다. 출력을 분할하는 대신 더 쉬운 방법이 있습니다. 명령줄에 파일 이름을 전달하는 대신 wc파일 출력을 리디렉션하는 것입니다. 그런 다음 wc파일 이름 없이 숫자만 인쇄하세요.

if [[ $(wc -l <"/disk1/environment.sh") -ge 0 ]];then  
   echo "File has data"  
fi

또는 어쨌든 bash 구문을 사용하고 있으므로

if (($(wc -l <"/disk1/environment.sh") >= 0)); then  
   echo "File has data"  
fi

물론 행 수가 항상 0보다 크거나 같으므로 이는 항상 true입니다. 하지만 다른 숫자를 사용하면 유용한 결과를 얻을 수 있습니다.

첫 번째 시도에서는 -ge연산자를 사용합니다. 이것은 정수 연산자입니다. 왼쪽 변이 정수가 아니고 와 같기 때문에 오류 메시지가 나타납니다 42 /disk1/environment.sh.

두 번째 시도에서는 <조건문에 연산자를 사용합니다. 이 연산자는 문자열 비교입니다(어휘순으로 정렬됨). wc -l /disk1/environment.sh항상 사전적으로 나오는 출력은 0숫자로 시작하기 때문에 [[ $(wc -l <"/disk1/environment.sh") > 0 ]]항상 true입니다 . 예외는 /disk1/environment.sh존재하지 않는 것입니다. 이 경우 wc -l표준 출력에는 아무것도 생성되지 않으며(대신 표준 오류에 오류 메시지가 기록됩니다) 비교는 거짓입니다.

파일의 줄 수를 0과 비교하는 것은 그다지 유용하지 않습니다. 최신 시스템에서는 wc -l개행 횟수를 계산합니다. 텍스트 파일에서 줄바꿈 개수는 파일이 비어 있는 경우에만 0입니다. (일반적으로 wc -l파일에 줄바꿈이 포함되어 있지 않으면 0이 반환됩니다. 텍스트 파일에는 각 줄 끝에 줄바꿈이 포함되어 있으며 텍스트가 아닌 파일의 적은 수의 줄바꿈은 유용한 정보입니다.) 조건에 연산자가 있습니다. 파일이 비어 있는지 테스트하기 위해 표현식을 사용하면 를 호출할 필요가 없습니다 wc.

if [[ ! -e /disk1/environment.sh ]]; then
  if [[ -L /disk1/environment.sh ]]; then
    echo "/disk1/environment.sh is a broken symbolic link"
  else
    echo "/disk1/environment.sh does not exist"
  fi
elif [[ ! -r /disk1/environment.sh ]]; then
  echo "/disk1/environment.sh exists but is not readable"
elif [[ ! -s /disk1/environment.sh ]]; then
  echo "/disk1/environment.sh is empty or is a special file (name pipe, etc.)"
else
  echo "/disk1/environment.sh is not empty"
fi

관련 정보