免费注册 查看新帖 |

Chinaunix

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

perl变量传入shell命令后提示shell语法错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-12 11:55 |只看该作者 |倒序浏览
本帖最后由 db_pub 于 2014-11-12 14:17 编辑

有如下要求 取出nfs挂接的所有目录中剩余空间最大的一个,根据最大的再取得对应的目录
在perl中时获取最大的空间后,根据空间大小再取得对应挂接目录是提示如下错误
   @nfsSize = `df -k | grep ":" | /usr/bin/awk '{print \$4}'`;
   @nfsDir = ();
   $max = 0;
   foreach $arrayTmp (@nfsSize)
   {
     if($max < $arrayTmp)
    {
      $max = $arrayTmp;
    }
   }
   
   @nfsDir = `df -k | grep ':' | grep $max |  /usr/bin/awk '{print \$4, \$NF}'`;
   print "nfsdir @nfsDir \n";

sh: syntax error at line 2: `|' unexpected
发现只要在带有变量的后面在接其他shell命令就会提示shell语法错误

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2014-11-12 13:25 |只看该作者
回复 1# db_pub

what do you want to do?
说说你想做什么?

X-Y Problem
http://bbs.chinaunix.net/forum.p ... mp;fromuid=24785593

论坛徽章:
0
3 [报告]
发表于 2014-11-12 14:18 |只看该作者
回复 2# jason680


    多谢提醒,这个表达的是有点问题,希望大家引以为戒

论坛徽章:
0
4 [报告]
发表于 2014-11-12 14:49 |只看该作者
问题已经解决因为在获取$max的值之后没有用chomp函数去掉最后的换行符导致的,下面这样是正确的

@nfsSize = `df -k | grep ":" | /usr/bin/awk '{print \$4}'`;
   @nfsDir = ();
   $max = 0;
   foreach $arrayTmp (@nfsSize)
   {
     if($max < $arrayTmp)
    {
      $max = $arrayTmp;
    }
   }
   chomp $max;
   @nfsDir = `df -k | grep ':' | grep $max |  /usr/bin/awk '{print \$4, \$NF}'`;
   print "nfsdir @nfsDir \n";

论坛徽章:
0
5 [报告]
发表于 2014-11-13 23:13 |只看该作者
回复 1# db_pub
这段Perl程序居然用了awk,令人匪夷所思。其实这个问题可以这么用Perl干净利落的搞定:
  1. #!/usr/bin/env perl

  2. use strict;

  3. my @entries;
  4. open (my $fh, "du -k  |") or die "Fail to open pipe";
  5. while(<$fh>) {
  6.     chomp;
  7.     my ($size, $file) = split(/\s+/, $_);
  8.     push @entries, [$file, $size];
  9. }

  10. foreach my $entry (sort { $b->[1] <=> $a->[1] } @entries) {
  11.     printf "%s\t%d\n", $entry->[0], $entry->[1];
  12. }
复制代码
或者如果你的操作系统够新的话,coreutils 7.5 +,可以用G,M,K作单位, 根本不用Perl:
  1. du -sh * | sort -h -r
复制代码
如果用k的话,在旧一点的系统上(RHEL 5.9)也能用:
  1. du -sk * | sort -n -r
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-11-14 15:00 |只看该作者
回复 5# schnell18

谢谢你的回复,所负责的程序以前使用perl写的,我现在是实现新的功能扩展。现在是边看perl资料边做新功能扩展,很是蛋疼啊
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP