たぶんこれは愚かな質問かもしれませんが、私は最初にshスクリプトに触れ、私のロジックが正しいことを確認するために約2時間待たなければならなかったので、ここで質問したいと思いました。
特定のファイルの行番号を取得するshスクリプトがあります。条件が満たされたら、shスクリプト全体を終了/停止する必要があります。
if [wc -l "$file_data" -lt 2000]; then
echo "does not meet minimum requirements"
exit -1
exit 0
それとも選択する必要があるかわかりませんexit 1
。exit -1
答え1
ロジックは正確ですが、構文が正しくありません。
if [ "$(wc -l <"$file_data")" -lt 2000 ]; then
echo 'Error error' >&2
exit 1
fi
[
]
前後にそれぞれスペースが必要です。[
別のコマンドであり、]
コマンドの最後のパラメータである必要があるため、スペースが必要です。コマンドの出力は、コマンド置換によって文字列に置き換えることができます
$(...)
。上記のテストでは、コマンド置換を使用してファイルの行数を計算しました。結果は文字列に挿入され、数値2000と比較されます。ファイルのデータをにリダイレクトしますwc -l
。つまり、出力からファイル名を削除する必要はありませんwc
。終了状態は、成功した場合は0で、失敗した場合は1から127までのゼロ以外の整数でなければなりません。ゼロ以外のものに加えて、この数字はコードによって割り当てられた意味以外に本質的な意味を持ちません。いくつかのツールは異なる数値を使用して異なるエラー条件を指定します。
curl
(「終了コード」セクション)およびrsync
(「終了値」セクション)のマニュアルを参照してください。ほとんどのツールは1
障害信号にのみ使用されます。診断メッセージ、エラーなどは標準エラーストリームに出力する必要があります。リダイレクトでこれを行うことができます
>&2
。これにより、出力にエラーメッセージが混在することなく、診断メッセージからスクリプトからの一般的な出力が切り離されます。同じ理由で、対話型プロンプト、質問なども標準エラーストリームとして出力されます。声明は
if
で終わりますfi
。
また見てくださいhttps://www.shellcheck.net/Webサイトは、最も基本的なエラーを見つけるのに役立つツールを提供しています。