如何在perl中使用变量作为管道命令的输入?

时间:2016-10-11 21:02:42

标签: perl shell

示例:

foreach $gid (sort (keys %list)){
    if ($list{$gid} >= $count){
        print "$list{$gid} ---> ";
        print "$gid ---> ";
        system(getent group | grep -w ^$gid | awk -F: '{printf $0 } ');
    }
}

**这里$gid是包含我想在系统命令中搜索的值并且打印该命令的第一部分的变量。

3 个答案:

答案 0 :(得分:3)

没有理由在这里炮轰。看起来您想要组ID中的组名。 Perl的内置getgrgid()函数可以通过传入GID来轻松处理:

for my $gid (sort (keys %list)){
    if ($list{$gid} >= $count){
        print "$list{$gid} ---> ";
        print "$gid ---> ";
        my $name = getgrgid($gid); # <-- here
        print "** $name **\n";
    }
}

答案 1 :(得分:3)

而不是尝试构建包含正确的正则表达式的正确shell命令,使用提供的C库调用更简单。

目前还不清楚你想要什么。 if(Input.GetKey (KeyCode.LeftArrow)) { this.transform.localScale -= new Vector3 (this.transform.localScale.x - scalingSpeed, this.transform.localScale.y - scalingSpeed, 0); } else if (Input.GetKey (KeyCode.RightArrow)) { this.transform.localScale += new Vector3 (this.transform.localScale.x - scalingSpeed, this.transform.localScale.y - scalingSpeed, 0); } 听起来你有一个群组的ID,但$gid会让你看起来像是一个群组的名字。因此,我提供了两个答案。

如果您有一个群组的名称,并且您想要其ID,

^$gid

如果您有一个群组的ID,并且您想要其名称,

my $name = 'root';

while ( my ($this_name, $this_id) = ( getgrent() )[0,2] ) {
   if ($this_name eq $name) {
      print("$this_id\n");
      last;
   }
}

答案 2 :(得分:0)

system需要一个字符串,所以只需在其他地方使用插值。

system("getent group | grep -w ^$gid | awk -f: '{printf \$0}'");

(您需要转义$命令中的awk以防止Perl在将字符串传递给$0之前展开system。)