쉘 스크립트에 루프가 있는 파이프

쉘 스크립트에 루프가 있는 파이프

다음 정보가 포함된 텍스트 파일이 있습니다.

Game Copies_Sold(M) Release_date Genre   
God_of_War 19 20/04/2018 Action-Adventure 
Uncharted_4 16 10/05/2016 Action-adventure 
Spider-Man 13 07/09/2018 Action-adventure  
The_Witcher_3 10 18/05/2015 Action_role-playing

두 번째 열의 숫자를 합산해야 하므로 다음 스크립트를 작성했습니다.

#!/bin/bash                                           
file=$1                                                   
s=0                                                      
tail -n +2 $file |cut -f 2 |                                
{ while read line                                          
do                                                      
s=$(( $s+$line ))                                        
done <$file }                                            
echo $s

하지만 분명히 내가 뭔가 잘못하고 있습니다. 여기서 무엇을 해야 할까요? 감사합니다!

답변1

다음과 같아야 합니다.

#! /bin/sh -
file=${1?}
awk 'NR >= 2 {sum += $2}; END {print sum+0}' < "$file"

접근 방식에 문제가 있습니다.

이러한 오류 중 일부는 다음과 같습니다.주택 검사(시스템에 독립 실행형 소프트웨어로 설치할 수도 있습니다).

여기에는 다음이 제공됩니다.

$ shellcheck myscript
 
Line 4:
tail -n +2 $file |cut -f 2 |                                
           ^-- SC2086 (info): Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
tail -n +2 "$file" |cut -f 2 |                                
 
Line 5:
{ while read line                                          
        ^-- SC2162 (info): read without -r will mangle backslashes.
 
Line 7:
s=$(( $s+$line ))                                        
^-- SC2030 (info): Modification of s is local (to subshell caused by pipeline).
      ^-- SC2004 (style): $/${} is unnecessary on arithmetic variables.
         ^-- SC2004 (style): $/${} is unnecessary on arithmetic variables.
 
Line 8:
done <$file }                                            
      ^-- SC2086 (info): Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
done <"$file" }                                            
 
Line 9:
echo $s
     ^-- SC2031 (info): s was modified in a subshell. That change might be lost.

관련 정보