Redireciona a saída de um comando com variáveis para um array

0

Estou tentando redirecionar a saída de um comando que contém algumas variáveis de entrada do usuário para uma matriz. Eu tentei primeiro este script -

echo "Type the ACL name"
read acl
echo "Type the DATACENTER name"
read dc
echo "ACL is $acl, DC is $dc"
mkdir ~/$acl
device=($(grep -iEr $acl ~/sync-configs/$dc/configs/* | awk -F ':' {'print $1'} | awk -F '/' {'print $NF'} | sort | uniq))

O script criou o diretório ~ / acl muito bem, mas o grep não funcionou para mim. Então, depois de fazer uma pesquisa, ajustei o grep para colocar as variáveis entre aspas duplas, assim -

echo "Type the ACL name"
read acl
echo "Type the DATACENTER name"
read dc
echo "ACL is $acl, DC is $dc"
mkdir ~/$acl
device=($(grep -iEr "$acl" ~/sync-configs/"$dc"/configs/* | awk -F ':' {'print $1'} | awk -F '/' {'print $NF'} | sort | uniq))

Isso parece funcionar bem e consigo ver elementos na matriz de dispositivos.

Minha pergunta é por que preciso colocar as aspas $ acl e $ dc ao alimentá-las para a matriz, mas o comando mkdir ~/$acl não exige nenhuma aspas? Alguém pode dar clareza sobre isso?

    
por user168115 13.05.2017 / 07:25

1 resposta

2

Geralmente, aspas são usadas para preservar o significado literal dos valores e evitar que o interpretador faça transformações em caracteres especiais e outras operações, como expansão de parâmetro e divisão de palavras.
Se você estiver usando " para citar palavras, as variáveis serão expandidas ainda, mas nenhuma divisão de palavras será executada.
A divisão de palavras é o processo em que o shell está usando uma string e - dividindo-a conceitualmente em palavras ou tokens diferentes.
Então, se você digitou isso no prompt de leitura

bangalore data center

seu comando seria expandido da seguinte forma:
Com citações

grep -iEr "$acl" ~/sync-configs/"$dc"/configs/*

torna-se

grep -iEr bangalore data center ~/sync-configs/"$dc"/configs/*
          ^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            pattern argument      File/s argument to grep
            to grep

Sem citações

grep -iEr $acl ~/sync-configs/"$dc"/configs/*

torna-se

grep -iEr bangalore data center ~/sync-configs/"$dc"/configs/*
          ^^^^^^^^^ |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            pattern |    File/s argument to grep

nota: no acima, $dc também teria sido expandido.

    
por 13.05.2017 / 08:10