Bash
帶參數的循環函式在另一個帶參數的循環函式中
# 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
to 會j
產生所需的輸出。但為什麼?
因為變數在 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