dl = 40.00などのBash ifステートメントのヘルプ変数$ dl < 500;

dl = 40.00などのBash ifステートメントのヘルプ変数$ dl < 500;
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 ]

これは、「変数の内容が算術式で実行される場合、コマンドの結果が$dl500未満です。これを行うには、値を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です。

おすすめ記事