Expande uma variável composta contendo duas ou mais variáveis

2

Eu tenho estas 5 variáveis:

drt="/var/www/html"

drt_chown="chown -R www-data:www-data ${drt}/"
drt_chmod="chmod -R a-x,a=rX,u+w ${drt}/"
rss="systemctl restart nginx.service"
rpf="/etc/init.d/php*-fpm restart"

Eu tentei combinar / concatenar / adicionar as últimas 4 variáveis, dentro de uma variável composta chamada rse , apenas para que fosse confortável expandir todas elas de uma vez:

rse="${drt_chown} ; ${drt_chmod} ; ${rss} ; ${rpf}"

Eu tentei expandir rse :

${rse}

Infelizmente, essa expansão de rse falhou com o seguinte conjunto de erros:

chown: cannot access ';': No such file or directory
chown: cannot access 'chmod': No such file or directory
chown: cannot access 'a-x,a=rX,u+w': No such file or directory
chown: cannot access ';': No such file or directory
chown: cannot access 'systemctl': No such file or directory
chown: cannot access 'restart': No such file or directory
chown: cannot access 'nginx.service': No such file or directory
chown: cannot access ';': No such file or directory
chown: cannot access 'restart': No such file or directory

Minha pergunta é qual é a maneira correta e mais rápida de expandir minha variável composta? Ou pelo menos qual é a melhor alternativa na sua opinião?

O aspecto da atribuição é muito importante para mim aqui.

Notas:

1. A questão atual é um acompanhamento para pergunta , feita por engano (porque eu pretendia fazer a pergunta atual).

2. Palavras-chave para o Google (não disponível em tags): expansão de uma variável mestra / mega variável ou uma variável de variáveis.

    
por user9303970 11.02.2018 / 22:03

1 resposta

4

Concatenar as variáveis não é o problema, ambas as atribuições a rse irão concatenar as strings bem. O problema é o mesmo da sua pergunta anterior: operadores especiais como ; e && (e & e | e > e " etc.) não são interpretados após a expansão da variável.

Ou seja, não há redirecionamento ou condicional aqui, apenas expansão de variável dentro de uma string (uma espécie de concatenação de string). As citações em cmd não são especiais:

$ cmd1='echo "foo" > bar'
$ cmd2='echo "false"'
$ cmd="$cmd1 || $cmd2"
$ $cmd
"foo" > bar || echo "false"

Você provavelmente deve usar funções, por exemplo,

drt="/var/www/html"
drt_chown() { chown -R www-data:www-data "${drt}/"; }

e depois executá-lo como qualquer comando, com apenas drt_chown . Observe que isso aplicaria o valor atual da variável drt .

Melhor ainda, faça a função aceitar um parâmetro:

www_chown() { chown -R www-data:www-data "$1"; }

www_chown /var/www/html

Então, se você quiser, você pode fazer uma função que chama as outras funções.

doitall() {
    drt_chown &&
    drt_chmod &&
    ...
}
    
por 11.02.2018 / 22:44

Tags