免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6720 | 回复: 8
打印 上一主题 下一主题

关于用perl调用unix shell命令的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-06 19:09 |只看该作者 |倒序浏览
各位大侠,我想在perl 中调用shell 命令实现,通过从一个配置文件中读取对应值来给变量赋值。

#!/usr/bin/perl
use Shell;

my $kk1=`awk -F= '{if ($1~/Hostname/) print $2 }'  /home/file.cfg`;
print "$kk1\n";

执行时报错,可能是awk语句里面的特殊符号倒的乱。麻烦各位帮我看一下。谢谢!
----------file.cfg中的内容----
Hostname=AAA
ip=128.0.1.191

论坛徽章:
0
2 [报告]
发表于 2007-09-06 21:43 |只看该作者
#!/usr/bin/perl -w
use strict;
my $a=`awk -F"=" '{if(\$1~/Hostname/)print \$2}' a`;
print "$a";

论坛徽章:
0
3 [报告]
发表于 2007-09-07 16:21 |只看该作者

谢谢 大侠,我忘了转义符了。还有一个问题麻烦帮忙看一下。

my $Hosts=`awk -F= '{if (\$1\~/Hosts/) print \$2 }' $CFG_ENV/env.cfg`;
my $Ds_User=`awk -F= '{if (\$1\~/Ds_User/) print \$2 }' $CFG_ENV/env.cfg`;

我有两个变量是调用shell 来获取的,但是把这两个变量放在一起print就会有回车符出现,请问大侠帮忙分析一下是什么原因?最初怀疑是换行符,我用chomp也不行。
print "$Hosts $Ds_User"; -->下面是结果
localhost
   AA

-----env.cfg的内容------
Hosts=localhost
Ds_User=AA
Ds_pwd=BB

论坛徽章:
0
4 [报告]
发表于 2007-09-07 16:41 |只看该作者

大侠还在么?版主呢?

大侠还在么?版主呢?请指教一下,谢谢!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2007-09-07 17:07 |只看该作者
\r的问题...你的file内是存\r\n..chomp只能去掉\n
所以要用$a=~s/[\r\n]//;
清掉..

论坛徽章:
0
6 [报告]
发表于 2007-09-08 12:50 |只看该作者

谢谢 大侠,但还是有些问题,麻烦您再指点一下。

代码如下,实现的功能和env.cfg文件的内容点楼顶,

my $Hosts=`awk -F= '{if (\$1\~/Hosts/) print \$2 }' env.cfg`;
my $Ds_User=`awk -F= '{if (\$1\~/Ds_User/) print \$2 }' env.cfg`;
my $Ds_pwd=`awk -F= '{if (\$1\~/Ds_pwd/) print \$2 }' env.cfg`;

# --UDATE Variable
$Hosts=~s/[\r\n]//;   --->按照大侠的思路去\r的操作
#$Ds_User =~ s/\n//g;
$Ds_User =~s/[\r\n]//;
$Ds_pwd =~s/[\r\n]//;

print "$Hosts $Ds_User $Ds_pwd";

-----------------------------------返回结果-----------------------------------
localhost
AA
BB
-----------问题描述-------
我把这个print 定向到一个文本里,发现没有了unix的回车换行符,但是变量还是做了硬回车,不知道是怎么回事,请教大侠指点迷津!!
后来我又根据大侠的思路把这几个变量放到一个数组里面,再=~s/[\r\n]//替换,print后发现就可以了,代码如下,但我始终觉得我用的方法比较笨,不知道高手们有没更好的办法来实现我这个需求,不用调用shell,直接用perl来从文件里提取需要的内容???
$Hosts=~s/[\r\n]//;
$Ds_User =~s/[\r\n]//;
$Ds_pwd =~s/[\r\n]//;

my @jj=($Ds_User,$Ds_pwd,$Hosts);
$jj[0]=~s/[\r\n]//;
$jj[1]=~s/[\r\n]//;
$jj[2]=~s/[\r\n]//;
#@jj=~s/[\r\n]//;
print "$jj[0] $jj[1] $jj[2]";
---------  结果返回 -----------
localhost AA BB

[ 本帖最后由 robin_hood1112 于 2007-9-8 13:01 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-09-08 14:53 |只看该作者
都已经 Perl 了,读个配置文件还要 awk。

论坛徽章:
0
8 [报告]
发表于 2007-09-09 10:09 |只看该作者

致,flw

法王,小弟刚刚接触perl,想用perl来替代以前shell实现的功能,请大法师指点一下,我上面用 awk的来读配置文件,用perl怎么来实现呢。偶刚刚接触比较菜。还请多多指教呀。

论坛徽章:
0
9 [报告]
发表于 2007-09-09 15:27 |只看该作者
## ---
my $ENV_CONF=env.cfg';

open(FD,$ENV_CONF);
my @array=<FD>;
#$line=<FD>;
close(FD);

my ($host_tag,$Hosts)=split(/=/,$array[0]);
my ($user_tag,$Ds_User)=split(/=/,$array[1]);
my ($pwd_tag,$Ds_pwd)=split(/=/,$array[2]);

$Hosts=~s/[\r\n\r\n]//;
$Ds_User =~s/[\r\n\r\n]//;
$Ds_pwd =~s/[\r\n]//;
print "$Hosts $Ds_User $Ds_pwd";
------- 第一次去回车换行的结果 ----
localhost
AA
BB
my @Larry=($Hosts,$Ds_User,$Ds_pwd); ## 再去一次 \s \n

$Hosts=~s/[\r\n]//;
$Ds_User=~s/[\r\n]//;
$Ds_pwd=~s/[\r\n]//;

print "$Hosts $Ds_User $Ds_pwd";
-------再去一次回车换行的结果 ----
localhost AA BB

请问高人,我为什么要两次=~s/[\r\n]// 才能把变量的回力换行符彻底清除掉呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP