Por que uma variável é passada para o comando su, mas não para uma matriz do mesmo escopo?

2

No exemplo abaixo, por que $var é passado para a su na função de início, mas não a matriz 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

O script acima retorna:

$ sudo ./test.sh start
-- -- cat
-- -- cat
-- -- cat
-- -- cat
out of function
-- one -- cat
-- two -- cat
-- three -- cat
-- four -- cat
    
por Gregg Leventhal 04.03.2015 / 15:44

2 respostas

2

O problema era que desde que a instrução su estivesse entre aspas duplas, as variáveis eram todas expandidas antes do comando su ser chamado, o que significa que $ var se torna "cat" mas $ i se torna "" porque não foi definido. Bash não sabe que deveria ser uma variável iteradora, apenas a expande para uma string NULL. A resposta é escapar desse "$" assim:

#!/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
    
por 04.03.2015 / 16:06
1

O parâmetro especial ${array[@]} entre aspas duplas causa a divisão de palavras se a matriz tiver mais de um membro:

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

Se os nomes dos seus módulos não contiverem espaços, você poderá ter mais sorte usando o * subscrito:

$ for word in "for i in ${arr[*]} ; do" ; do echo "$word" ; done
for i in a b c ; do
    
por 04.03.2015 / 15:50