Como faço para escapar e interpolar corretamente as variáveis no Bash?

3

Eu estou tentando escrever um one-liner para converter entidades html presentes em alguns arquivos (todos html com codificação UTF-8)

Eu tentei %código% mas isso também converte caracteres não-ASCII (quebra os caracteres UTF-8)

Em StackOverflow , encontrei algo que funciona para um arquivo:

php -r '$f=@fopen("file.htm", "r");echo html_entity_decode(fread($f, 20000));fclose($f);'

mas quando tento fazer vários arquivos com

for fi in *.htm; do php -r '$f=@fopen("$fi", "r");echo html_entity_decode(fread($f, 20000));fclose($f);';done

Eu sei que o problema aqui é como "escapar" $ fi (bash variable), então o PHP não o lê como uma variável PHP. Algum conselho?

    
por Diego Alcántara 27.05.2013 / 17:50

2 respostas

3

Você está muito quase lá.

E, por acaso, a questão não é sobre como fazer isso, mas sim sobre como obter bash para interpretar variáveis e passá-las adiante.

Você tem:

for fi in *.htm; do php -r '$f=@fopen("$fi", "r");echo html_entity_decode(fread($f, 20000));fclose($f);';done

Que tem aspas simples, com aspas duplas no interior.

As aspas simples não são interpoladas dentro do bash, mas as aspas duplas são ... então, se você alterá-lo para:

for fi in *.htm; do php -r "\$f=@fopen(\"$fi\",'r');echo html_entity_decode(fread(\$f, 20000));fclose(\$f);"; done

Como agora estamos usando aspas duplas, também precisamos escapar dos $ signs, caso contrário o bash acha que são variáveis interpoláveis e as substitui.

    
por 27.05.2013 / 18:43
1

Com bash, aspas (simples) ' são usadas para impedir a expansão de parâmetros (variáveis). Então você deve inverter o uso de aspas simples e duplas na sua chamada bash para php, e adicionar aspas duplas com escape para o comando php arg:

for fi in *.htm; do fi=\"$fi\"; php -r "\$f=@fopen($fi, 'r');echo html_entity_decode(fread(\$f, 20000));fclose(\$f);"; done

Ou, mais simples, baseado na resposta de Michael Hampton , apenas faça:

for fi in *.htm; do cat $fi | php -R 'echo html_entity_decode($argn);'; done
    
por 27.05.2013 / 18:46

Tags