쉘 스크립트를 사용하여 2D 매트릭스를 구현하는 방법은 무엇입니까?

쉘 스크립트를 사용하여 2D 매트릭스를 구현하는 방법은 무엇입니까?

쉘 스크립트를 사용하여 anxn 2D 행렬을 구현하려고 합니다. 행렬 요소의 입력을 얻기 위해 두 개의 for 루프를 사용합니다. 그런데 별도의 루프를 사용하여 요소를 가져온 후 값을 인쇄하면 마지막 행만 n 번 인쇄됩니다. 아래에서 코드와 출력을 찾아보세요.

#!/bin/bash
read -p "Enter the size of matrix: " n
c=`expr $n - 1`

# Get the matrix elements

for i in $(seq 0 1 $c)
do
        for j in $(seq 0 1 $c)
        do
                read -p "enter the value of $i, $j element " arr[$i,$j]
        done
done

# Print the matrix

for i in $(seq 0 1 $c)
do
        for j in $(seq 0 1 $c)
        do
                echo -n "${arr[$i,$j]} "
        done
        echo
done

산출:

ubuntu@ip-172-31-6-229:~/shellscript$ ./matrix.sh
Enter the size of matrix: 3
enter the value of 0, 0 element 1
enter the value of 0, 1 element 2
enter the value of 0, 2 element 3
enter the value of 1, 0 element 4
enter the value of 1, 1 element 5
enter the value of 1, 2 element 6
enter the value of 2, 0 element 7
enter the value of 2, 1 element 8
enter the value of 2, 2 element 9
7 8 9
7 8 9
7 8 9

보시다시피, 출력을 인쇄할 때 모든 줄 중 마지막 줄을 인쇄합니다. 누구든지 이 문제를 해결하도록 도와줄 수 있나요?

셸: BASH

감사해요

답변1

긴 이야기 짧게

declare -A arr루프에서 값을 읽기 전에 추가하면 코드가 원하는 방식으로 작동합니다. 하지만 자신이 무엇을 하고 있는지 모를 수도 있으므로 더 긴 버전을 꼭 읽어보세요.

확장 버전

Bash는 다차원 배열을 지원하지 않습니다. 여기서 본질적으로 생성하는 것은 다음과 같습니다.연관 배열그리고 이것이 작동하려면 변수가 연관 배열임을 명시적으로 선언해야 합니다. 그러므로 declare -A arr. 자세한 내용은 다음을 참조하세요.여기.

각 입력 후에 배열을 인쇄하여 실제로 배열이 어떻게 수정되었는지 확인할 수 있으므로 내부 루프는 다음과 같습니다.

        for j in $(seq 0 1 $c)
        do
                read -p "enter the value of $i, $j element " arr[$i,$j]
                echo ${arr[*]}
        done

3개의 인덱스( n=30, 1, 2)만 생성되고 후자의 인덱스가 j변경되면 해당 인덱스의 값이 대체됩니다.

그렇지 않은 경우 declare -A연관 배열을 만들지 않고 정수로 인덱스된 일반 배열을 만듭니다. 여기에 문제가 있습니다. 인덱스는 쉼표 연산자가 양쪽을 평가하지만 오른쪽의 값만 반환하는 산술 표현식으로 처리됩니다.

답변2

다음을 시도해 보세요:

#!/bin/bash
read -p "Enter the size of matrix: " n
c=`expr $n - 1`

declare -A arr

# Get the matrix elements

for ((i=0;i<=c;i++))
do
        
    for ((j=0;j<=c;j++))
    do
        read -p "enter the value of $i, $j element " arr[$i,$j]
    done
done

# Print the matrix


for ((i=0;i<=c;i++))
do
    for ((j=0;j<=c;j++))
    do
            echo -n "${arr[$i,$j]} "
    done
    echo
done

결과:

$ ./matrix.sh 
Enter the size of matrix: 3
enter the value of 0, 0 element 1
enter the value of 0, 1 element 2
enter the value of 0, 2 element 3
enter the value of 1, 0 element 4
enter the value of 1, 1 element 5
enter the value of 1, 2 element 6
enter the value of 2, 0 element 7
enter the value of 2, 1 element 8
enter the value of 2, 2 element 9
1 2 3 
4 5 6 
7 8 9

관련 정보