Aplique um filtro ao valor de uma variável usando backticks

1

Desculpe por fazer uma pergunta tão simples, mas ler sobre esse assunto na internet se mostrou infrutífero. Eu estou tentando entender melhor o operador de grave / backtick e eu tenho feito tudo bem até agora, exceto em uma ocasião.

Suponha que eu tenha um script bash e uma variável nele, assim:

var='ls -al | grep '^...x'

Agora, o script exige que o usuário insira algo e, com base no que é esse algo, gera um resultado. Então, sem aborrecê-lo com o roteiro completo, quero reduzi-lo a uma pergunta. Se o usuário inserir "-t" como argumento, o script precisará imprimir todos os arquivos .txt que podem ser executados pelo usuário, por exemplo:

$var | grep '\.txt$'

Agora, o problema surge quando tento reatribuir o valor de var. Eu tentei fazer:

var='$var | grep '\.txt$''

mas isso não funciona. Eu não tenho certeza do que estou perdendo aqui, qual é a maneira correta de lidar com isso?

    
por Lahsi 11.05.2015 / 04:51

2 respostas

1

Você deve tentar se afastar dos operadores de carrapatos para executar comandos. Não é tão portátil quanto usar algo como o seguinte:

$ my_var=$(ls -la | grep '^...x')

Em relação ao seu problema, tente

$ var=$(echo $var | grep '\.txt$')
    
por 11.05.2015 / 05:10
0

O material dentro dos acentos graves (ele é chamado substituição de comando , por sinal) é um comando a ser executado. Quando você escreve

$var | grep '\.txt$'

isto executa o valor de var como um comando. Não é isso que você quer: você deseja passar o valor como entrada para o comando grep . Isso é basicamente

echo "$var" | grep '\.txt$'

para que a tarefa seja

var='echo "$var" | grep '\.txt$''

Eu recomendo usar a sintaxe dólar-parêntese em vez dos acentos graves, porque as regras de cotação são mais fáceis de entender, especialmente com substituições aninhadas:. A substituição de comando começou com $( se estende até a correspondência )

var="$(echo "$var" | grep '\.txt$')"

Observe as aspas duplas em torno de $var . A sintaxe $var significa apenas "o valor de var " entre aspas duplas; fora aspas duplas, é mais complicado. Consulte Por que o meu script shell engasgar com espaço em branco ou outros caracteres especiais? para mais informações.

Tenha em atenção que analisar a saída de ls é geralmente uma má ideia . Ele manipula alguns nomes de arquivos e raramente é o caminho mais simples. Se você quiser listar apenas .txt arquivos, basta usar o padrão de curinga *.txt (isto exclui arquivos de ponto, ao contrário ls -al , para incluí-los, adicione o padrão .*.txt ). Se você quiser considerar apenas os que são executáveis, uma maneira robusta é processá-los em um loop:

for x in *.txt; do
  if [ -x "$x" ]; then
    … do stuff
  fi
done
    
por 12.05.2015 / 02:37