매개변수가 있는 루프 함수가 매개변수가 있는 다른 루프 함수 안에 있습니다.

매개변수가 있는 루프 함수가 매개변수가 있는 다른 루프 함수 안에 있습니다.
# Print $1 $2 times
function foo() {
    for (( i=0; i<$2; i++ )); do
        echo -n $1
    done
    echo
}

# Print $1 $2x$3 times
function bar() {
    for (( i=0; i<$3; i++ )); do
        foo $1 $2
    done
}

bar $1 $2 $3

이상적인 출력 foobar.sh @ 3 3

@@@
@@@
@@@

하지만 실제 출력은

@@@

bar()변수를 변경하면 원하는 출력이 생성 i됩니다 . j그런데 왜?

답변1

변수는 로컬 변수로 선언하지 않는 한 쉘 스크립트에서 "전역"이기 때문입니다. 따라서 한 함수가 변수를 변경하면 i다른 함수는 해당 변경 사항을 확인하고 그에 따라 동작합니다.

따라서 함수에 사용되는 변수, 특히 i, j, x, y와 같은 루프 변수의 경우 지역 변수로 선언해야 합니다. 아래를 참조하세요...

#!/bin/bash
# Print $1 $2 times
function foo() {
  local i
  for (( i=0; i<"$2"; i++ )); do
    echo -n $1
  done
  echo
}

# Print $1 $2x$3 times
function bar() {
  local i
  for (( i=0; i<"$3"; i++ )); do
    foo "$1" "$2"
  done
}

bar "$1" "$2" "$3"

결과:

$ ./foobar.sh a 3 3
aaa
aaa
aaa
$ ./foobar.sh 'a b ' 4 3
a ba ba ba b
a ba ba ba b
a ba ba ba b

관련 정보