
cat $1 | while read line
$1은 리눅스 쉘 스크립트 실행시 1번째로 입력받은 값을 의미합니다.
while read line은 반복문으로 read명령을 통해 파일을 한줄씩 읽고 line(변수명)에 저장하라는 의미입니다.
| $0 | $1~10 | $* | $@ | $# |
|---|---|---|---|---|
| 스크립트명 | 입력 값 | 전체 인자 값 | *와 동일 | 매개 변수의 총 개수 |
do
~~
done
위 while문의 반복범위입니다. C언어의 { }와 비슷합니다.
sum = 0
for ((i=1; ; i++))
sum이라는 변수에 0을 저장하고 for반복문의 조건을 지정합니다.
C언어와 동일합니다. i=1부터 시작하며 i를 1씩 더합니다.
data=$(echo $line | cut -d '$' -f$i)
data라는 변수에 값을 할당합니다.
먼저 echo $line으로 line의 내용을 출력하고(print와는 다릅니다)
cut -d '$'는 '$'문자를 기준으로 split하고
-f$i는 문자열 중 몇번째 필드를 선택할지를 정하는 것입니다.
즉 위 내용은 반복문을 통해 어떤 파일을 한줄씩(line) 읽어내고
파일을 '$'문자를 기준으로 잘라서 data에 넣는 행위를 반복하는 내용입니다.
if [[ -z $data ]]; then
line2=$(echo $line | tr "$" " ")
echo "$line2 $sum"
arr[$i]=$((${arr[$i]}+$sum))
break
If 문입니다.
[[-z $data]]는 data에 저장된 문자열의 길이가 0이면 true를 반환합니다.
line2=$(echo $line | tr “$” “ “)
위에서 작성했던 ct과 코드가 상당히 비슷하지만 cut과 tr의 차이가 딱 눈에 들어옵니다. Cut은 문자열을 자른다면 tr은 특정 문자열을 대체하는 명령입니다. 즉 $문자가 있다면 “ ”로 대체하여 line2라는 변수에 저장하도록 되어있습니다.
echo “$line2 $sum”
arr[$i]=$((${arr[$i]}+$sum))
위에서 저장했던 line2와 sum이라는 변수를 출력한 뒤 Arr이라는 배열에 값을 할당하고 있습니다. (Sum은 처음엔 0으로 선언되어 있습니다.)
여기서 arr[$i]는 배열의 i번째 행을 의미하고, ${arr[$i]}는 i번째 행의 값을 의미합니다. Sum에 저장된 값과 arr의 해당 행렬에 저장되어있던 값을 더하여 arr의 기존 위치의 값을 갱신하는 코드입니다.
위 코드는 line의 길이가 0일 경우만 실행됩니다. 그 의미는 파일의 마지막 문자열까지 작업을 끝낸 경우에만 실행한다는 뜻입니다.
else
sum=$(($sum+$data))
temp=$(i-1))
arr[$temp]=$((${arr[$temp]}+$data))
fi
Else로 시작하여 첫 if문의 조건에 반대에 해당하는 경우 실행하도록 되어있습니다.
Sum=$(($sum+$data))
Temp=$((i-1))
Sum의 값을 data와 더해서 갱신합니다
Temp의 값을 i-1로 저장합니다
Arr[$temp]=$((${arr[$temp]}+$data))
배열arr의 위치(i-1)에 배열arr[i-1]의 값과 data를 더한 값을 넣어 갱신합니다.
Fi 를 통해 반복문을 종료합니다.
Temp는 배열의 위치로 사용하고 있는데 여기서 i-1의 의미는 반복문의 반복횟수이며, 입력받은 문자열의 행을 의미합니다. Arr에 행을 문자열의 행과 동일하게 입력하고 있습니다.
If [[ $line == $(tail -n 1 $1) ]]; Then
echo “${arr[@]}”
fi
If문을 통해 line에 저장된 값이 $1으로 입력받은 값의 마지막줄과 같다면 지금까지 저장해둔 arr배열을 전체 출력하고 종료합니다.