monterey2="12.0"
macOS=$(sw_vers -productVersion)
if [ "$macOS" >= "$monterey2" ] ; then
echo "Monterey"
else
echo "not Monterey"
fi
exit 0
이 오류는 출력 -> "[:12.2.1: 단항 연산자 예상"입니다. 저도 동일한 결과로 -eq를 시도했습니다. 내가 뭘 잘못했나요?
답변1
두 버전 번호를 모두 에코 sort -V
하고 어느 버전이 먼저 나타나는지 확인합니다(텍스트로). 텍스트로 일치하는 경우 $monterey2
값은 다음 sw_vers
보다 크거나 같습니다.
부동 소수점 비교는 버전 번호에서 작동하지 않습니다. 그 이유는 부분이 모두 정수이기 때문입니다(반드시 두 개일 필요는 없음). 예:
12.3 is earlier than 12.10
12.3.11 is later that 12.3.8
답변2
에서는 문자열 비교 [
만 지원되고 는 지원되지 않습니다 . 숫자 비교의 경우 를 사용할 수 있지만 정수 가 아니므로 숫자 연산자에서는 작동하지 않습니다.>
>=
-ge
12.2.1
Monterey를 확인하려면 =
(문자열 동일성)을 사용하십시오.
if [ "$macOS" = "$monterey2" ] ; then
답변3
문제는 test
정수나 문자열만 이해하는데 부동 소수점을 비교하고 싶다는 것입니다. bc
비교 결과를 얻으려면 을 사용하는 것이 좋습니다 .
특히 다음을 변경하세요.
if [ "$macOS" >= "$monterey2" ] ; then
이와 관련하여:
if [ $(echo "$macOS >= $monterey2" | bc) ]; then
편집하다
12.2.1
버전 번호에 소수점 이하 자릿수가 두 개 이상인 경우에는 실제로 작동하지 않습니다.
답변4
if [ "$macOS" >= "$monterey2" ] ; then
이 오류는 출력 -> "[:12.2.1: 단항 연산자 예상"입니다.. 내가 뭘 잘못하고 있는 걸까요?
이런 일이 일어나는 [
이유는일반 명령, 따라서 >
리디렉션 연산자의 일반적인 방식으로 작동합니다. 그 이후의 단어는 =
파일 이름으로 처리되며 명령에 전달되기 전에 제거됩니다 [
. 따라서 실제로 가 있는 경우 파일 이름이 더 이상하고 순서가 더 복잡하다는 점만 [ 12.2.1 >= 12.0 ]
비슷합니다 .[ 12.2.1 12.0 ] > outputfile
[
end 앞에 두 개의 인수가 표시되므로 ]
단항 연산자와 해당 피연산자가 필요합니다. 예를 들어 기존 일반 파일인지 [ -f xyz ]
확인합니다 . xyz
물론 12.2.1
유효한 연산자가 아니므로 오류가 발생합니다. 또한 =
스크립트가 실행되는 디렉터리에서 호출되는 파일을 찾을 수 있습니다.
나는 또한 같은 결과로 -eq를 시도했습니다.
글쎄요, 질문 제목에서 언급한 것처럼 오류 메시지가 "정수 표현식 필요"이기 때문에 동일한 결과가 아닙니다. Bash는 정수 연산만 수행하며 값은 정수가 아닙니다. 해결책이 있습니다Bash 또는 다른 언어/프레임워크에서 정수 및 부동 소수점 계산을 수행하는 방법은 무엇입니까?
하지만, 다른 답변에서 언급했듯이 버전 번호를 십진수/부동 소수점 숫자로 비교할 수는 없습니다. 12.0
숫자이기는 하지만 12.2.1
그렇지 않습니다.