Use um parâmetro em um argumento de comando

4

Eu executo o comando find para pesquisar arquivos com um nome contendo perl :

find /tmp -name '*perl*'
/tmp/perl.pl
/tmp/run-perl-stage.pl

Mas quando eu defino o nome do perl em uma variável PARAMETER e executo o comando find novamente, não obtenho nenhum resultado! Como executar o comando find com $PARAMETER ?

PARAMETER=perl
find /tmp -name '*$PARAMETER*'                 

não obtém resultados.

find /tmp -name '*\$PARAMETER*'

não obtém resultados.

    
por yael 07.03.2013 / 14:55

2 respostas

3

Você precisa usar aspas duplas, e não aspas simples.

Dentro de aspas simples '…' , cada caractere é interpretado literalmente. O único caractere tratado especialmente é o caractere de aspas simples, que finaliza a string literal.

Dentro de aspas duplas "…" , os seguintes caracteres são tratados especialmente:

  • " (aspas duplas) termina a string citada.
  • $ (dólar) é expandido. Ele pode iniciar uma substituição de variável ou uma substituição de comando ou uma expressão aritmética: "$PARAMETER" , "${PARAMETER}" , "${PARAMETER%/*}" , "$(somecommand)" , $((x+2)) , etc.
  • ' (backquote) é expandido. É uma forma alternativa de substituição de comando que é difícil de usar quando você tem caracteres especiais no comando aninhado: 'foo' é como $(foo) , mas é mais difícil acertar em casos complexos.
  • Em shells interativos, ! pode acionar a expansão do histórico.
  • \ (barra invertida) cita o caractere seguinte, mas apenas se for um dos caracteres nessa lista: com outros caracteres, a barra invertida permanece. Por exemplo, "foo\$\bar" é equivalente a 'foo$\bar' . Como uma exceção, uma sequência de barra invertida-nova linha é ignorada: a barra invertida consome o seguinte caractere de nova linha.

Uma conseqüência disso é que você não pode ter uma aspa simples dentro de uma string entre aspas simples. Para contornar isso, você pode agrupar partes: echo 'Here'\''s a string with a single quote' passa um argumento para echo , que é expresso em três partes, duas strings com aspas simples com \' (expandindo para uma única aspa simples) entre elas.

Como você deseja que a substituição de variável ocorra, use aspas duplas:

find /tmp -name "*$PARAMETER*"

A propósito, há uma diferença entre "$PARAMETER" e $PARAMETER . Com aspas duplas, o shell procura o valor de PARAMETER e expande essa cadeia para a linha de comando. Sem aspas, o valor de PARAMETER é interpretado como uma lista separada por espaço em branco de padrões de caractere curinga. Isso quase nunca é desejável, portanto, sempre coloque aspas duplas em torno das substituições de variáveis e comandos.

    
por 08.03.2013 / 01:35
0

Primeiro, nunca use a variável de maiúsculas no bash, pode entrar em conflito com as variáveis de sistema existentes.

Em segundo lugar, para o seu problema, você pode fazer isso assim (se você ainda quiser uma citação simples, em vez de duplas),

param='*perl*'
find /tmp/ -name $param
    
por 08.03.2013 / 00:46