IF文で整数式をテストする方法(コマンドから抽出)

IF文で整数式をテストする方法(コマンドから抽出)

システムダウンタイムがしきい値を超えたときにシステムサービスを開始する単純なスクリプトをbashに作成しました。もし部分はデフォルトで整数値(コマンドから抽出)をチェックします。臨界点値(整数)

コントロールはしないだろうもし氏名。誰でも私に上記の解決策を提案できますか? IF文で整数式をテストする方法

#!/bin/bash
**function start_repair {                                                       
        threshold=120
        IP=10.194.51.216
        echo "$((systemctl status cassandra | awk'/(Active:failed)/{print$10}')| awk '{print ($0+0)}')"
        if [[ "$((systemctl status cassandra | awk '/(Active: failed)/{print $10}') | awk '{print ($0+0)}')" -gt "${threshold}" ]]; then
          echo "greater than ${threshold}"
          service cassandra restart
          PID=$!
          wait $PID
          echo done
    fi }**

間違い: bash: 5行: [: : 整数式が必要

答え1

あなたの質問とあなたの機能にいくつかの問題があります。

まず、[: : integer expression expectedエラーあなたの機能によって生成されません。関数内のテストでは[[ ... -gt ... ]]このエラーは発生しません(テストのためにコマンドラインで使用されます[[ "hello" -gt "world" ]])。このエラーを生成する単一の括弧を使用する別のテストがどこかにあります(コマンドラインで使用してテスト[ "hello" -gt "world" ])。[ ... ]コードの他の場所で算術テストを探します。

bashエラーメッセージ自体は、この[ユーティリティがエラーを生成し、算術テストを実行しようとしたターゲットが空の文字列であったことを示しているため、これを確認できます。

print (0+$0)コメントでコードが機能するように変更したと言われました。ステートメントが同じであるため、この変更がどのような影響を与えるか疑われます。おそらくスクリプトへの入力が変更され、エラーが発生しなかった可能性があります。print 0+$0awk

その後、in testに変更したとコメントしました-gt>これにより、テストを辞書式文字列ソートテストに変更します。そのようなテストは本物たとえば、左側の文字列が右側の文字列の後に来ると、次のよう20 > 100になります。本物

これは、エラーが実際に表示される関数にないことも無視します。

私のアドバイスは、スクリプトを作成してスクリプトを作成するときにスクリプトの各コンポーネントをテストして、スクリプトの各追加が目的のアクションを実行することを確認することです。


機能自体には問題がたくさんあります。

たとえば、変数はプロセスのプロセスIDを保持するPID必要がありますが、これをバックグラウンドジョブ(コマンドの最後に使用される)として実行しないため、予想されたものとは異なります。そしてその後のプロセスはあなたが待っていると思うプロセスを待ちません。cassandracassandra&PIDwait $PID

PID変数と呼び出しによってwait達成したいことは明確ではありません。私の考えでは、ペアの割り当てPIDとペアの呼び出しを削除できることですwait

$(( ... ) | ... )で書く方が良いです$( ... | ... )。まず、systemctl | awkサブシェルで実行するのは不要で、2番目は読み取りが混乱しています$(( ... ))山水評価する。

パスワード

awk'/(Active:failed)/ {print $10}' | awk '{print ($0+0)}'

にマージすることができます。

awk'/(Active:failed)/ { print 0+$10 }'

関連情報