파일 이름 없이 이 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이 아닌 상태로 종료된 마지막(가장 오른쪽) 명령의 값이거나 모든 명령이 성공적으로 종료된 경우 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
답변2
가능한 한 빨리 확인하고 싶습니다.
#!/bin/bash
file="$1"
if [[ -z "$file" ]]; then
echo "Error: no file provided." >&2
echo "usage: $0 file" >&2
exit 1
elif [[ ! -f "$file" ]]; then
echo "Error: no such file '$file'" >&2
exit 2
fi
sort ... "$file" | awk ...