# 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