You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Perl执行shell命令时嵌套引号内美元符号的转义方法

解决Perl嵌套命令中$符号的转义问题

这个问题的核心在于Perl的反引号(``)操作符会对内部字符串进行变量插值——你写在反引号里的${binary:Package}${Version}被Perl当成了自己的变量来解析,但这些变量根本没定义,所以被替换成了空字符串,最终传给dpkg-query的格式串就变成了"_",自然输出_\n

下面给你两种可行的解决方法:

方法一:转义Perl层面的$符号

在反引号里的每个$前面加上反斜杠\,告诉Perl不要把这些$当作自己的变量,而是原封不动传递给shell:

echo firefox | perl -ne 'chomp $_; print `dpkg-query -W -f="\${binary:Package}_\${Version}" $_` . "\n"'

这里额外加了chomp $_是为了去掉$_里的换行符(管道传递过来的每行末尾都有换行),避免dpkg-query处理带换行的包名可能出现的问题。

方法二:使用qx操作符并包裹单引号

Perl的qx操作符和反引号功能一样,但你可以用单引号作为分隔符,这样内部的$符号完全不会被Perl插值,直接传递给shell:

echo firefox | perl -ne 'chomp $_; print qx'dpkg-query -W -f="${binary:Package}_${Version}" $_' . "\n"'

或者换一种分隔符(比如/),避免单引号嵌套的视觉混淆:

echo firefox | perl -ne 'chomp $_; print qx/dpkg-query -W -f="${binary:Package}_${Version}" $_/ . "\n"'

两种方法都能让dpkg-query正确识别格式串里的变量,输出你想要的firefox_版本号结果。

内容的提问来源于stack exchange,提问作者rookie099

火山引擎 最新活动