在单引号和双引号内引用{print $ NF}?

时间:2017-08-21 18:43:54

标签: perl tcsh

试图弄清楚如何用双引号内的单引号单引号。这就是我要做的事情......

从perl,我想运行一个系统命令...... - ssh进入远程机器 - 执行'正常运行时间'然后从中取出最后一个字段(平均负载持续15分钟)。

\#\!/usr/bin/env perl   
my $cmd = "ssh othermachine 'uptime | awk '{print $NF}'' > local_file.dat";   
system($cmd);

当然这不会运行......

% ./try.pl

Missing }.
%

缺少"}" ???看起来它将$ NF}解释为var?我试图逃避{}字符而没有运气。我试图逃避$,没有运气。我在}之前尝试了一个空格,没有运气但是不同的msg(未定义的变量)。

c-shell BTW并提前感谢!

2 个答案:

答案 0 :(得分:5)

您希望以下内容成为ssh的第二个参数:

uptime | awk '{print $NF}'

为此,您只需在其周围放置单引号即可。但这不起作用,因为它包含单引号。

您想要构建一个包含$NF的字符串,但您按如下方式执行:

"...$NF..."

这会将(不存在的)Perl变量$NF的值放在字符串中。

一步一步地做。

  • 静态:

    1. 远程命令:

       uptime | awk '{print $NF}'
      
    2. 本地命令:

      ssh othermachine 'uptime | awk '\''{print $NF}'\''' >local_file.dat
      
    3. 字符串文字:

      my $local_cmd = q{ssh othermachine 'uptime | awk '\''{print $NF}'\''' >local_file.dat}
      
  • 动态:

    use String::ShellQuote qw( shell_quote );
    
    my $remote_cmd = q{uptime | awk '{print $NF}'};
    my $local_cmd = shell_quote('ssh', 'othermachine', $remote_cmd) . ' >local_file.dat';
    

答案 1 :(得分:0)

使用Net::OpenSSH并让它为您做引用:

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($othermachine,
                            remote_shell => 'tcsh');
$ssh->system({stdout_file => 'local_file.dat'},
             'uptime', \\'|', 'awk', '{print $NF}')
  or die "ssh command failed: " . $ssh->error;