동일한 범위의 배열 대신 변수가 su 명령에 전달되는 이유는 무엇입니까?

동일한 범위의 배열 대신 변수가 su 명령에 전달되는 이유는 무엇입니까?

아래 예에서 시작 함수의 배열에는 $var전달되지만 su배열에는 전달되지 않는 이유는 무엇입니까 modules?

#!/bin/bash
var=cat
modules=(
one
two
three
four
)

start() {
    su gleventh -c "for i in ${modules[@]}; do echo -- $i -- $var;  done"
}

$1

echo "out of function"
for i in ${modules[@]}; do echo -- $i -- $var;  done

위 스크립트는 다음을 반환합니다.

$ sudo ./test.sh start
-- -- cat
-- -- cat
-- -- cat
-- -- cat
out of function
-- one -- cat
-- two -- cat
-- three -- cat
-- four -- cat

답변1

문제는 su 문이 큰따옴표로 묶여 있기 때문에 su 명령이 호출되기 전에 변수가 확장된다는 것입니다. 즉, $var는 "cat"이 되지만 $i는 정의되지 않았기 때문에 ""가 됩니다. Bash는 그것이 반복자 변수여야 한다는 것을 모르고 단지 NULL 문자열로 확장합니다. 대답은 다음과 같이 "$"를 이스케이프하는 것입니다.

#!/bin/bash
var=cat
modules=(
one
two
three
four
)

start() {
    su gleventh -c "for i in ${modules[@]}; do echo -- \$i -- $var;  done"
}

$1

echo "out of function"
for i in ${modules[@]}; do echo -- $i -- $var;  done

답변2

${array[@]}배열에 여러 멤버가 있는 경우 큰따옴표로 묶인 특수 매개변수로 인해 단어 분할이 발생합니다.

$ for word in "for i in ${arr[@]} ; do" ; do echo "$word" ; done
for i in a
b
c ; do

모듈 이름에 공백이 포함되어 있지 않으면 *아래 첨자를 사용하는 것이 더 좋습니다.

$ for word in "for i in ${arr[*]} ; do" ; do echo "$word" ; done
for i in a b c ; do

관련 정보