パラメーター付きのループ関数は、パラメーター付きの別のループ関数内にあります。

パラメーター付きのループ関数は、パラメーター付きの別のループ関数内にあります。
# 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

関連情報