在下面的例子中,为什么在启动函数中$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