将Perl转换为Shell

时间:2015-06-15 18:09:16

标签: perl shell

我有用于SNMP walk设备的Perl脚本。但是,我可以使用的服务器不允许我安装所需的所有模块。所以我需要将脚本转换为Shell(sh)。我可以在各个设备上运行脚本,但希望它能像在Perl中那样从文本中读取。 Perl脚本以:

开头
 open(TEST, "cat test.txt |");
@records=<TEST>;
close(TEST);

foreach $line (@records)
                {
                ($field1, $field2, $field3)=split(/\s+/, $line);
                # Run and record SNMP walk results.

2 个答案:

答案 0 :(得分:2)

根据输入的确切内容以及您尝试执行的操作,perl代码片段可能会转换为:

while read field1 field2 field3
do 
    # Run and record SNMP walk results.
    echo "1=$field1 2=$field2 3=$field3"
done <text.txt

例如,如果text.txt是:

$ cat text.txt
one two three
i ii iii

然后,上面的代码产生输出:

1=one 2=two 3=three
1=i 2=ii 3=iii

正如您所看到的,shell read命令一次读取一行(记录),并且还在空格上进行拆分。 read有很多选项来控制换行符或其他内容是否划分记录(-d)以及是否要在空格或其他内容(IFS)上进行拆分或是否在输入是否被视为转义字符(-r)。请参阅man bash

答案 1 :(得分:0)

while read string; do
  str1=${string%% *}
  str3=${string##* }
  temp=${string#$str1 }
  str2=${temp%% *}
  echo $str1 $str2 $str3
done <test.txt

备用版

while read string; do
  str1=${string%% *}
  temp=${string#$str1 }
  str2=${temp%% *}
  temp=${string#$str1 $str2 }
  str3=${temp%% *}
  echo $str1 $str2 $str3
done <test.txt

POSIX substring parameter expansion

  

$ {参数%字}

     

删除最小的后缀模式。这个词应该扩展到产生   一种模式。然后参数扩展将产生参数,   后缀的最小部分与模式匹配   删除。

     

$ {参数%%字}

     

删除最大的后缀模式。这个词应该扩展为产生一个   图案。然后参数扩展将产生参数   后缀的最大部分与删除的模式匹配。

     

$ {参数#字}

     

删除最小的前缀模式。这个词应该扩展到产生   一种模式。然后参数扩展将产生参数,   前缀的最小部分与模式匹配   删除。 $ {parameter ## word}删除最大的前缀模式。这个单词   应扩大以产生一种模式。参数扩展应   然后导致参数,具有前缀的最大部分   与删除的模式匹配。

     

$ {参数##字}

     

删除最大的前缀模式。这个词应该扩展为产生一个   图案。然后参数扩展将产生参数   前缀的最大部分与删除的模式匹配。