为什么传递给 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

相关内容