执行bash脚本,读取其输出并使用Perl创建html
我有一个bash脚本,它生成不同的整数值。当我运行该脚本时,输出如下所示: 十二, 三十四 三十四 67 六, 此脚本在Solaris服务器上运行。为了向网络中的其他用户提供这些值,我决定编写一个Perl脚本,它可以:执行bash脚本,读取其输出并使用Perl创建html,perl,bash,Perl,Bash,我有一个bash脚本,它生成不同的整数值。当我运行该脚本时,输出如下所示: 十二, 三十四 三十四 67 六, 此脚本在Solaris服务器上运行。为了向网络中的其他用户提供这些值,我决定编写一个Perl脚本,它可以: 运行bash文件 读取其输出 构建一个小html页面,其中包含一个存储bash值的表 这对我来说是一项艰巨的工作,因为我几乎没有Perl方面的经验。我知道我可以使用system执行unix命令(和bash文件),但无法获得输出。我还听说了qx,这听起来对我的案例非常有用 但我
- 运行bash文件
- 读取其输出
- 构建一个小html页面,其中包含一个存储bash值的表
但我必须承认我不知道如何开始。。。您能给我一些提示如何解决这个问题吗?要捕获bash文件的输出,您可以使用backtick操作符:
use strict;
my $e = `ls`;
print $e;
要捕获bash文件的输出,可以使用backtick操作符:
use strict;
my $e = `ls`;
print $e;
为什么只使用perl:
您可以在shell脚本本身中使用awk。
我以前做过这件事。
如果变量中有out put值,则使用以下方法:
echo $SUBSCRIBERS|awk 'BEGIN {
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?><GenTransactionHandler xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><EntityToPublish>\n<Entitytype=\"C\" typeDesc=\"Subscriber level\"><TargetApplCode>UHUNLD</TargetApplCode><TrxName>GET_SUBSCR_DATA</TrxName>"
}
{for(i=1;i<NF+1;i++) printf("<value>%d</value>\n",$i)}
END{
print "</Entity>\n</EntityToPublish></GenTransactionHandler>"}' >XML_SUB_NUM`date +%Y%m%d%H%M%S`.xml
echo$SUBSCRIBERS|awk'开始{
打印“\nHunldGet\u SUBSCR\u数据”
}
{对于(i=1;i为什么只使用perl:
您可以在shell脚本本身中使用awk。
我以前做过这件事。
如果变量中有out put值,则使用以下方法:
echo $SUBSCRIBERS|awk 'BEGIN {
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?><GenTransactionHandler xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><EntityToPublish>\n<Entitytype=\"C\" typeDesc=\"Subscriber level\"><TargetApplCode>UHUNLD</TargetApplCode><TrxName>GET_SUBSCR_DATA</TrxName>"
}
{for(i=1;i<NF+1;i++) printf("<value>%d</value>\n",$i)}
END{
print "</Entity>\n</EntityToPublish></GenTransactionHandler>"}' >XML_SUB_NUM`date +%Y%m%d%H%M%S`.xml
echo$SUBSCRIBERS|awk'开始{
打印“\nHunldGet\u SUBSCR\u数据”
}
{for(i=1;i像这样的问题有点难知道从哪里开始
您所指的qx
是Perl的一个特性。“q*”或“类似于引号的操作符”记录在Perl“操作符”手册页中(通常您会使用man perlop
在传统安装Perl的系统上阅读)
具体地说,qx
是“引用的命令执行”…它本质上是Perl中`(反勾号或“命令替换”)操作符的另一种形式
换句话说,如果执行如下命令:
perl-e'$foo=qx{ls};打印“\n####\n$foo\n###\n”
…在安装了Perl的系统上,它应该运行Perl,Perl应该计算(-e)您提供的表达式(引号)。换句话说,我们正在命令行上编写一个小程序。这个程序首先创建一个变量,其内容将是“标量”(这是Perl对字符串或数字的术语)。我们正在将通过执行ls
命令捕获的输出赋值给($foo)。之后,我们将使用这些内容前后的##行打印变量的内容(无论ls
命令将打印什么)
Perl的qx
操作符(以及其他各种q*操作符)的一个怪癖它允许您使用任意字符来分隔命令。例如,perl-e'$bar=qx/pwd/;”
将捕获pwd
命令的输出。当您在文本括号、大括号、方括号等周围使用通常用作分隔符的任何字符时)然后,qx
命令将查找适当的匹配分隔符。如果您使用任何其他标点符号(或非字母数字字符?),则该字符也将作为终止分隔符。此后续行为类似于“替换”中的功能,并受其启发来自旧的sed
实用程序和ed
行编辑器的命令;而括号、大括号等的匹配是Perl的创新之处
这就是如何捕获shell脚本输出的基础。要在HTML表中打印数字,必须将捕获的输出拆分为单独的行(保存到列表或数组中),然后打印HTML序言(
和
(标题)标记等)…它们在一系列
行上循环,将数字插入
(表数据)容器中),然后最后打印HTML尾声(带结束标记)
为此,您需要阅读Perlprint
函数以及Perl中的“插值”。这是一个相当复杂的主题
这都是非常粗糙的,有一些工具可以让您在更高的级别上处理HTML的生成。您是否希望将shell脚本的执行包装在Perl脚本中也是相当可疑的,因为您似乎可以修改shell脚本以直接输出HTML(可能是由命令行开关或环境变量控制的选项)或者您可以用Perl重新编写shell脚本。这可能会消除解析输出的额外工作(将输出拆分为行,并将这些行中的值拆分为数组),因为您可以将数据直接捕获到数组中(或者可能在生成HTML行时直接打印出来)(不管您现有的shell脚本如何执行该操作)。像这样的问题,很难知道从哪里开始
您所指的qx
是Perl的一个特性。“q*”或“类似于引号的操作符”记录在Perl“操作符”手册页中(通常您会使用man perlop
在传统安装Perl的系统上阅读)
具体地说,qx
是“引用的命令执行”…它本质上是Perl中`(反勾号或“命令替换”)操作符的另一种形式
换句话说,如果执行如下命令:
perl-e'$foo=qx{ls};打印“\n####\n$foo\n###\n”
…在安装了Perl的系统上,它应该运行Perl,Perl应该计算(-e)已安装的表达式p