Preciso atribuir um comando a uma variável e executá-lo com a variável no bash do Linux. O comando executa bem na linha de comando, mas não na variável por causa de várias aspas. Espero que a barra invertida deva ser usada para várias aspas para evitar o erro. Por favor, ajude com o formato correto.
Código:
parm="cat file|awk '$1>0 && $1="abc" {print f $0} {f=$0 ORS}'"
eval "$parm"
Conteúdo:
abc
123
efg
456
Erro:
awk: cmd. line:1: >0 && =abc {print f bash} {f=bash ORS}
awk: cmd. line:1: ^ syntax error
Desde já, obrigado!
Para armazenar código, use funções, não variáveis:
Se você tivesse que usar variáveis:
Provavelmente é mais fácil quando usamos apenas aspas simples e, para inseri-las, retiramos as aspas e as colocamos com
\'
.Veja também:
Quando o delimitador é citado em
<< 'delimiter'
, não há$param
,$(( arith ))
,`cmdsubst`
,$(cmdsubst)
nem\
continuação de linha acontecendo dentro dos documentos, o que torna fácil escrever qualquer texto multilinha contendo qualquer coisa.Substituí
cat file |
(faz pouco sentido vincularcat
um único arquivo) por< file
, tirei$1 = "abc"
a atribuição da condição em que era confusa e adicionei um separador (aqui uma nova linha que também melhora a legibilidade) entre as duasawk
instruções, conforme exigido pelo POSIX.Usar funções também significa que ele pode ser parametrizado como em:
Onde o primeiro argumento é feito o stdin de
awk
ou:Onde todos os argumentos são tomados como caminhos de arquivo (ou stdin se
-
¹ ou nenhum argumento for fornecido) e concatenados e o resultado alimentado comoawk
stdin de por meio de um pipe ou:Onde todos os argumentos são passados para
awk
o que pode tomá-los como caminhos de arquivo, stdin para-
¹ (ou se não houver argumento de caminho de arquivo) ou atribuições de variáveis awk² ³.¹ use
./-
para o arquivo chamado literalmente-
no diretório de trabalho atual² use
./foo=bar.txt
para um arquivo chamado literalmentefoo=bar.txt
no diretório de trabalho atual.³ Esteja ciente de que no GNU ,
awk
também conhecido como , é interpretado como with taken as a regexp. funciona em torno disso, mas emite um aviso, uma abordagem melhor para contornar esse recurso incorreto é chamar as que desabilita esse recurso incorreto para gawk e deve ser inofensivo para outras implementações.gawk
new=@/text/
new=text
text
new='\@/text/'
awk
POSIXLY_CORRECT=1 awk ...
awk