如何正确地转义和插入variables在Bash中?

我试图写一个单行程序来转换一些文件中存在的HTML实体(所有的HTML与UTF-8编码)

我试过recode HTML_4.0 file.htm但也转换非ASCII字符(它打破了UTF-8字符)

StackOverflow中,我发现了一个适用于一个文件的东西:

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

但是当我尝试使它与多个文件

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

我知道这里的问题是如何“逃避”$ fi(bashvariables),所以PHP不会将其读取为PHPvariables。 有什么build议?

你几乎在那里。

碰巧,问题不在于如何去做,而是如何让bash解释variables并将其传递。

你有:

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

其中有单引号,里面有双引号。

单引号不是由bash内部插入的,但双引号是..所以如果你改变它:

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

因为我们现在使用双引号,所以我们也必须转义$符号,否则bash认为它们是可插值的variables,并将它们replace掉。

使用bash,(单个)引号'用于防止参数扩展(variables)。 所以你应该在你的bash调用php中反转单引号和双引号的用法,并为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 

或者, 根据迈克尔·汉普顿的回答 ,更简单的做法是:

 for fi in *.htm; do cat $fi | php -R 'echo html_entity_decode($argn);'; done