带参数的循环函数位于另一个带参数的循环函数中

带参数的循环函数位于另一个带参数的循环函数中
# 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()将from中的变量更改i为 会j产生所需的输出。但为什么?

答案1

因为变量在 shell 脚本中是“全局”的,除非您将它们声明为本地变量。因此,如果一个函数更改了变量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

相关内容