Bash

帶參數的循環函式在另一個帶參數的循環函式中

  • September 5, 2019
# 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更改為ito 會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

引用自:https://unix.stackexchange.com/questions/539195