Como evitar que os símbolos em uma variável de ambiente escapem?

2

Desculpe antecipadamente se minha pergunta é muito básica, mas eu realmente estou presa aqui.

Estou tentando escrever um script de shell e, para torná-lo mais ou menos legível, decidi incluir uma parte dos meus comandos em variáveis de ambiente:

#!/bin/bash
# Variables

name_expression="-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)"

# Commands

find /root/ -maxdepth 1 "$name_expression" -execdir rm -rf {} \;
find /home/ -maxdepth 2 "$name_expression" -execdir rm -rf {} \;

O problema é que, se eu tentar executar este shell, muitos símbolos são encapsulados com aspas:

bash -x ./my_shell.sh 
+ name_expression='-type d \( -name .android -o -name .AndroidStudio* -o -name .gradle \)'
+ find /home/ /root/ -maxdepth 2 '-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)' -execdir rm -rf '{}' ';'
find: unknown predicate '-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)'

Existe alguma maneira de passar essa variável sem ser modificada?

    
por The Dreams Wind 06.09.2017 / 23:45

2 respostas

3
name_expression=( -type d \( -name .folder1 -o -name .wildcardfolder\* -o -name .folder2 \) )

find /root/ -maxdepth 1 "${name_expression[@]}" -execdir rm -rf {} \;

Em vez de um parâmetro de string que teria que ser sem aspas para o comando ver várias partes, isso usa um parâmetro de matriz. Desse modo, tanto a divisão quanto a cotação podem ser controladas (não completamente, ou seja, por parte, mas de maneira adequada para essa tarefa).

Uma alternativa que permite o controle completo seria o uso de eval , mas isso tornaria o restante da linha de comando mais complicado.

    
por 06.09.2017 / 23:50
2

Uma versão modificada que evita expansões glob potencialmente perigosas:

cleanupdir() {
  # args should be dirname, maxdepth
  find "$1" -maxdepth "$2" -type d \( -name .folder1 -o -name '.wildcardfolder*' -o -name .folder2 \) -execdir rm -rf {} \;
}

cleanupdir /root 1
cleanupdir /home 2
    
por 06.09.2017 / 23:53