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

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

我正在尝试编写一行代码来转换某些文件中存在的 html 实体(所有 html 均采用 UTF-8 编码)

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

堆栈溢出我发现了适用于一个文件的东西:

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 (bash 变量),以便 PHP 不会将其读取为 PHP 变量。有什么建议吗?

答案1

你是非常就快到了。

事实上,问题不在于如何去做,而在于如何让 bash 解释变量并传递它们。

你有:

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 会认为它们是可插值变量,并将其替换掉。

答案2

在 bash 中,使用 (单) 引号'来防止参数扩展 (变量)。因此,您应该在 bash 调用 php 时反转单引号和双引号的使用,并为 php 命令参数添加转义的双引号:

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

相关内容