# 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