!['-ge'를 사용한 배쉬 테스트 화장실 - 0으로 나누기 오류](https://linux55.com/image/104891/'-ge'%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%9C%20%EB%B0%B0%EC%89%AC%20%ED%85%8C%EC%8A%A4%ED%8A%B8%20%ED%99%94%EC%9E%A5%EC%8B%A4%20-%200%EC%9C%BC%EB%A1%9C%20%EB%82%98%EB%88%84%EA%B8%B0%20%EC%98%A4%EB%A5%98.png)
다음 스크립트에서는 오류가 발생합니다.
#!/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