私は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は10000より大きいです、しかし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
何人かの人々が知らないかもしれない1つのいいこともあります:
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
フロートがある場合は、関数を書いてからそれを使うことができます。
#!/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
私は、バージョン文字列を比較可能なプレーンな整数値に変換するための小さな関数を使うことでこれを解決しました:
function versionToInt() {
local IFS=.
parts=($1)
let val=1000000*parts[0]+1000*parts[1]+parts[2]
echo $val
}
これは2つの重要な仮定をします:
例えば
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