리눅스 쉘 스크립트

김승호·2023년 5월 22일

첫번째로 정리할 내용은 리눅스 쉘 스크립트입니다.

우연히 휴대폰에 저장해뒀던 사진을 찾아서 작성합니다.

스크립트의 목적은 성적이 입력된 파일을 입력받아 성적데이터와 과목별 성적의 합(행마다 과목이 다름)을 출력하는 코드입니다.


코드


라인 해석

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배열을 전체 출력하고 종료합니다.

profile
필요하다면 가능은 한 개발자, 컴퓨터공학전공

0개의 댓글