배쉬에서 숫자 비교
bash 터미널 용 스크립트 작성에 대해 배우기 시작했지만 비교가 올바르게 작동하는 방법을 알 수 없습니다. 내가 사용하는 스크립트는 다음과 같습니다
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
문제는 첫 번째 숫자의 숫자를 비교하는 것입니다. 즉 9는 10보다 크지 만 1은 09보다 큽니다.
진정한 비교를 위해 숫자를 유형으로 변환하는 방법은 무엇입니까?
bash에서는 산술 컨텍스트 에서 확인을 수행해야합니다 .
if (( a > b )); then
...
fi
지원하지 않는 POSIX 쉘의 경우 (())
, 당신은 사용할 수 있습니다 -lt
및 -gt
.
if [ "$a" -gt "$b" ]; then
...
fi
로 비교 연산자의 전체 목록을 얻을 수 있습니다 help test
.
평범하고 단순한
#!/bin/bash
a=2462620
b=2462620
if [ "$a" -eq "$b" ];then
echo "They're equal";
fi
Bash Scripting의 놀라운 세계에서 더 많은 숫자를 비교하고 싶다면 이 치트 시트를 확인하십시오 .
곧 정수는 다음과 만 비교할 수 있습니다.
-eq # equal
-ne # not equal
-lt # less than
-le # less than or equal
-gt # greater than
-ge # greater than or equal
일부 사람들이 알지 못하는 좋은 점이 하나 있습니다.
echo $(( a < b ? a : b ))
이 코드는 가장 작은 숫자를 인쇄 a
하고b
Bash에서는 (( ))
더 많은 산술 연산을 사용 하는 것과 달리 조건부 연산으로 더 많이 처리하기 때문에이 작업을 선호합니다 .
[[ N -gt M ]]
내가 같은 복잡한 일을하지 않는 한
(( (N + 1) > M ))
그러나 모든 사람은 자신의 취향을 가지고 있습니다. 안타깝게도 일부 사람들은 비공식 표준을 강요합니다.
최신 정보:
실제로이 작업을 수행 할 수도 있습니다.
[[ 'N + 1' -gt M ]]
이것은 [[ ]]
산술 물건 외에 할 수있는 다른 것을 추가 할 수있게 해줍니다 .
이 코드는 플로트를 비교할 수도 있습니다. awk를 사용하고 있지만 순수 bash는 아닙니다. awk는 기본적으로 운영 체제와 함께 제공되는 표준 POSIX 명령이므로 문제가되지 않습니다.
$ awk 'BEGIN {return_code=(-1.2345 == -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 >= -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 < -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
1
$ awk 'BEGIN {return_code=(-1.2345 < 2) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 > 2) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
더 짧게 사용하려면이 기능을 사용하십시오.
compare_nums()
{
# Function to compare two numbers (float or integers) by using awk.
# The function will not print anything, but it will return 0 (if the comparison is true) or 1
# (if the comparison is false) exit codes, so it can be used directly in shell one liners.
#############
### Usage ###
### Note that you have to enclose the comparison operator in quotes.
#############
# compare_nums 1 ">" 2 # returns false
# compare_nums 1.23 "<=" 2 # returns true
# compare_nums -1.238 "<=" -2 # returns false
#############################################
num1=$1
op=$2
num2=$3
E_BADARGS=65
# Make sure that the provided numbers are actually numbers.
if ! [[ $num1 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then >&2 echo "$num1 is not a number"; return $E_BADARGS; fi
if ! [[ $num2 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then >&2 echo "$num2 is not a number"; return $E_BADARGS; fi
# If you want to print the exit code as well (instead of only returning it), uncomment
# the awk line below and comment the uncommented one which is two lines below.
#awk 'BEGIN {print return_code=('$num1' '$op' '$num2') ? 0 : 1; exit} END {exit return_code}'
awk 'BEGIN {return_code=('$num1' '$op' '$num2') ? 0 : 1; exit} END {exit return_code}'
return_code=$?
return $return_code
}
$ compare_nums -1.2345 ">=" -1.2345 && echo true || echo false
true
$ compare_nums -1.2345 ">=" 23 && echo true || echo false
false
버전 문자열을 비교할 수있는 일반 정수 값으로 변환하는 작은 함수를 사용 하여이 문제를 해결했습니다.
function versionToInt() {
local IFS=.
parts=($1)
let val=1000000*parts[0]+1000*parts[1]+parts[2]
echo $val
}
이것은 두 가지 중요한 가정을합니다.
- 입력은 " normal SemVer string "
- 각 부분은 0-999 사이입니다
예를 들어
versionToInt 12.34.56 # --> 12034056
versionToInt 1.2.3 # --> 1002003
npm
명령이 최소 요구 사항을 충족하는지 테스트하는 예 ...
NPM_ACTUAL=$(versionToInt $(npm --version)) # Capture npm version
NPM_REQUIRED=$(versionToInt 4.3.0) # Desired version
if [ $NPM_ACTUAL \< $NPM_REQUIRED ]; then
echo "Please update to npm@latest"
exit 1
fi
수레가있는 경우 함수를 작성한 다음 예를 들어 사용할 수 있습니다
#!/bin/bash
function float_gt() {
perl -e "{if($1>$2){print 1} else {print 0}}"
}
x=3.14
y=5.20
if [ $(float_gt $x $y) == 1 ] ; then
echo "do stuff with x"
else
echo "do stuff with y"
fi
참고 URL : https://stackoverflow.com/questions/18668556/comparing-numbers-in-bash
'Programming' 카테고리의 다른 글
RVM을 제거하는 방법? (0) | 2020.02.17 |
---|---|
기존 Git 저장소를 다른 저장소로 가져 오는 방법은 무엇입니까? (0) | 2020.02.17 |
안드로이드 : 보이지 않는 것과 사라진 것의 차이점은 무엇입니까? (0) | 2020.02.17 |
CSS를 사용하는 다른 테이블 행 색상? (0) | 2020.02.17 |
APK 설치시 INSTALL_FAILED_NO_MATCHING_ABIS (0) | 2020.02.17 |