쉘 스크립트를 사용하여 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=3
0, 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