# 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