次の例では、開始関数の配列には$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