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$')
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?
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$')
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