downloadspeed=800.00
dl="$downloadspeed/1" | bc
if [ $((dl)) -lt 500 ]
then
echo "slow - send slow message"
else
echo "fast - no issue"
fi
私は何が間違っていましたか? $downloadspeedをテストするためにさまざまなバリエーションを試してみました。どのようにテストしても、私の変数は文字列として扱われるようです。 $downloadspeed < 500, $dl < 500, "$dl" < 500 など、さまざまなバリエーションを試しました。
答え1
最初のエラーはあなたの課題ですdl
。
dl="$downloadspeed/1" | bc
これは、「変数を$dl
次に設定することを意味します。ひも 800.00/1
その後、出力を渡します。変数が割り当てられるですbc
。割り当てには出力がないため、結果はdl
に設定されます800.00
。
しかし、これが重要です。パイプは独自のサブシェルで実行され、そのサブシェルに設定されているすべての変数は親シェルでは使用できません。これは、この割り当てが実際に必要な操作を実行しても、パイプラインが実行されdl
ている間にのみ設定し、スクリプト自体から設定を解除できることを意味します。
次に、次を実行します。
if [ $((dl)) -lt 500 ]
これは、「変数の内容が算術式で実行される場合、コマンドの結果が$dl
500未満です。これを行うには、値をdl
有効な算術式に設定する必要があります。たとえば、次のようになります。
800/1
$dl
ただし、上記のように、変数はパイプを実行しているサブシェルにのみ値を持つため、空の変数があります。
とにかく、すべてが本当に不必要に複雑です。これをしてはいけない理由:
#!/bin/sh
downloadspeed=800.00
value=$(printf '%s\n' "$downloadspeed"/1 | bc)
if [ $value -lt 500 ]
then
echo "slow - send slow message"
else
echo "fast - no issue"
fi
次に、この種の問題をデバッグするには。set -x
:を使用してスクリプトの先頭に追加できます。
#!/bin/sh
set -x
downloadspeed=800.00
dl="$downloadspeed/1" | bc
if [ $((dl)) -lt 500 ]
then
echo "slow - send slow message"
else
echo "fast - no issue"
fi
今スクリプトを実行すると、どのコマンドが正確に実行されているかを確認できます。
$ foo.sh
+ downloadspeed=800.00
+ dl=800.00/1
+ bc
+ '[' 0 -lt 500 ']'
+ echo 'slow - send slow message'
slow - send slow message
ご覧のとおり、空$dl
ですが、算術式()で使用されている場合は$(( ))
0と評価され、実際に実行されているため、[ 0 -lt 500 ]
常にtrueです。
答え2
$((dl))
bashの代わりに浮動小数点演算をサポートするzshなどのシェル(すでにzsh構文を引用せずに作成)を使用して、次の手順を実行します。
downloadspeed=800.00
if ((downloadspeed < 500))
then
echo "slow - send slow message"
else
echo "fast - no issue"
fi
浮動小数点演算をサポートしていないPOSIX構文の場合は、bash
比較を呼び出すことができます。sh
awk
compare() { # args: <number> <op> <number>
POSIXLY_CORRECT=1 awk -- "
BEGIN {exit(!((0+ARGV[1]) $2 (0+ARGV[2])))}" "$1" "$3"
}
if compare "$downloadspeed" '<' 500
then
echo "slow - send slow message"
else
echo "fast - no issue"
fi
POSIXLY_CORRECT=1
GNU実装がより多くの形式の数値を認識するのに役立つ場合awk
(たとえば、infinity
他の実装のYMMV 0x10
)0x1p4
、これは負の数をオプションとして扱う古いバージョン--
のbusyboxに役立ちます。awk
これは0+
、(末尾のテキストを無視)などの状況で文字列比較を使用するのではなく、数値比較を強制するためのものです。compare '8 apples' '<' '10 bananas'