파일의 숫자 평균을 계산하기 위해 쉘 스크립트를 작성 중인데 어떤 이유로 bash가 내 숫자를 합산하지 않습니다.
sum='expr $sum + $num' 형식을 지정하는 여러 방법을 시도했지만 계속 오류가 발생합니다.
while read line
do
sum=0
count=0
average=0
median=0
#read each line, sort it and put it into tempRows file
echo "$line" >> $tempRow
sort $tempRow
#add each number to the sum for avg calculation
for i in $tempRow
do
num=$i
count=`expr $count + 1`
echo "count: $count"
sum=`expr $sum + $num`
echo "sum: $sum"
done
#perform and print average calc at the end of each line
average=`expr $sum / $count`
echo -e "$average\t"
rm -f $tempRow
done < $tempFile
현재 이 코드는 종료하기 전에 다음과 같은 출력을 제공합니다.
count: 1
expr:non-numeric argument
sum:
expr:syntax error
나중에 중앙값 계산을 위해 tempRow에 추가하기 전에 각 행을 정렬합니다. 예제 파일에는 여러 행과 정수 열이 포함되며 각 행의 평균과 중앙값을 인쇄합니다.
답변1
달리기 bash -x myscript
. 이렇게 하면 실행 추적이 제공되어 문제가 명확해집니다.
귀하의 주요 질문은
for i in $tempRow
이 변수 $tempRow
에는 파일 이름이 포함되어 있습니다. 파일 이름에 공백이나 와일드카드가 포함되어 있지 않다고 가정하면 $tempRow
파일 이름이라는 한 단어가 포함된 목록으로 확장됩니다. 따라서 for 루프 본문은 한 번 실행되고 i
파일 이름으로 설정됩니다.
파일의 줄을 반복하려는 것 같습니다. 이를 위해 사용됩니다 while read
. 더 구체적으로,while IFS= read -r i; do …
.
몇 가지 추가 팁:
- 이유를 알지 못하는 한 항상 변수 확장을 큰따옴표로 묶어야 합니다..
- 를 사용하지 마세요
expr
. 지금은 21세기이고 모든 쉘에는 연산 기능이 내장되어 있습니다.count=$((count + 1))
등. - 외부 루프를 실행할 때마다 정렬하는 논리가 이상하지만 계산하려는 내용이 무엇인지 알아내려고 노력하지 않았습니다.