条件が満たされたら、shスクリプトを終了します。

条件が満たされたら、shスクリプトを終了します。

たぶんこれは愚かな質問かもしれませんが、私は最初にshスクリプトに触れ、私のロジックが正しいことを確認するために約2時間待たなければならなかったので、ここで質問したいと思いました。

特定のファイルの行番号を取得するshスクリプトがあります。条件が満たされたら、shスクリプト全体を終了/停止する必要があります。

if [wc -l "$file_data" -lt 2000]; then
        echo "does not meet minimum requirements"
        exit -1

exit 0それとも選択する必要があるかわかりませんexit 1exit -1

答え1

ロジックは正確ですが、構文が正しくありません。

if [ "$(wc -l <"$file_data")" -lt 2000 ]; then
    echo 'Error error' >&2
    exit 1
fi
  1. []前後にそれぞれスペースが必要です。[別のコマンドであり、]コマンドの最後のパラメータである必要があるため、スペースが必要です。

  2. コマンドの出力は、コマンド置換によって文字列に置き換えることができます$(...)。上記のテストでは、コマンド置換を使用してファイルの行数を計算しました。結果は文字列に挿入され、数値2000と比較されます。ファイルのデータをにリダイレクトしますwc -l。つまり、出力からファイル名を削除する必要はありませんwc

  3. 終了状態は、成功した場合は0で、失敗した場合は1から127までのゼロ以外の整数でなければなりません。ゼロ以外のものに加えて、この数字はコードによって割り当てられた意味以外に本質的な意味を持ちません。いくつかのツールは異なる数値を使用して異なるエラー条件を指定します。curl(「終了コード」セクション)およびrsync(「終了値」セクション)のマニュアルを参照してください。ほとんどのツールは1障害信号にのみ使用されます。

  4. 診断メッセージ、エラーなどは標準エラーストリームに出力する必要があります。リダイレクトでこれを行うことができます>&2。これにより、出力にエラーメッセージが混在することなく、診断メッセージからスクリプトからの一般的な出力が切り離されます。同じ理由で、対話型プロンプト、質問なども標準エラーストリームとして出力されます。

  5. 声明はifで終わりますfi

また見てくださいhttps://www.shellcheck.net/Webサイトは、最も基本的なエラーを見つけるのに役立つツールを提供しています。

関連情報