それとも、2つのコマンド間の演算子は失敗しますか?

それとも、2つのコマンド間の演算子は失敗しますか?

ファイル名なしでこのbashスクリプトを実行しているユーザーにusingステートメントを追加しようとしています。 「OR」演算子を使用できるようです。しかし、スクリプトはまだ失敗しました。

#! /bin/bash
file="$1"
sort -k3,3 -k2,2 -k1 "$1" | awk '{ sum=0; for(i=4; i<=NF; i++){sum+=$i}; sum/=NF-3; print int(sum),"["$1"]",$3",",$2}' || echo "Usage: GradesAwk.sh filename"

サンプルデータです。

123456789 Lee Johnson 72 85 90
999999999 Jaime Smith 90 92 91
888111818 JC Forney 100 81 97
290010111 Terry Lee 100 99 100
199144454 Tracey Camp 77 84 84
299226663 Laney Camp 70 74 71
434401929 Skyler Camp 78 81 82
928441032 Jess Forester 85 80 82
928441032 Chris Forester 97 94 89

ベストアンサー1

パイプライン障害オプション(デフォルトでは無効)により、一般的なbash動作が発生します。

Bashのマニュアルを参照:

パイプ失敗オプションが有効になっていない場合、パイプの戻り状態は最後のコマンドの終了状態です。 Pipefailが有効な場合、パイプラインの戻り状態は、ゼロ以外の状態で終了した最後の(最も右側の)コマンドの値、またはすべてのコマンドが正常に終了した場合は0です。

あなたの場合、sortコマンドは失敗しますが、awkコマンドは入力を受け取りません。これはawkの失敗ではありません。

したがって、||パイプライン障害が無効になり(デフォルト)、最後のパイプラインコマンド(awk)が成功したため、ブランチは実行されません。

set -o pipefailスクリプトにパイプラインの失敗を含めるだけでそれを有効にできます。

このテストを確認してください。

$ ls file7*
file7

$ sort file7 |awk '{print $1}' || echo "error"
abc
four
klm

$  sort file77 |awk '{print $1}' || echo "error"
sort: cannot read: file77: No such file or directory

$ sort file77 2>/dev/null |awk '{print $1}' || echo "error"

$ set -o pipefail

$ sort file77 2>/dev/null |awk '{print $1}' || echo "error"
error

おすすめ記事