如何将以下bash脚本转换为perl脚本

时间:2010-12-02 18:37:35

标签: perl bash


#!/bin/bash

i="0"

echo ""
echo "##################"
echo "LAUNCHING REQUESTS"
echo "  COUNT:  $2 "
echo "  DELAY:  $3 "
echo "  SESSID: $1"
echo "##################"
echo ""

while [ $2 -gt "$i" ]
do
  i=$[$i+1]
  php avtest.php $1 $4 &
  echo "EXECUTING REQUEST $i"
  sleep $3
done

这是bash中更好/修改过的脚本


#!/bin/bash

i="0"
#startTime=`date +%s`
startTime=$(date -u +%s)
startTime=$[$startTime+$1+5]
#startTime=$($startTime+$1+5)
dTime=`date -d @$startTime`
echo ""
echo "##################"
echo "LAUNCHING REQUESTS"
echo "  COUNT:  $1 "
echo "  DELAY:  1 "
#echo "  EXECUTION:  $startTime "
echo "  The scripts will fire at :  $dTime "
echo "##################"
echo ""

while [ $1 -gt "$i" ]
do
  i=$[$i+1]
  php avtestTimed.php $1 $3 $startTime &
  echo "QUEUEING REQUEST $i"
  sleep 1
done

1 个答案:

答案 0 :(得分:4)

这是直接翻译

#!/usr/bin/env perl
use strict;
use warnings;

print <<HERE;
##################
LAUNCHING REQUESTS
  COUNT:  $ARGV[1]
  DELAY:  $ARGV[2]
  SESSID: $ARGV[0]
##################
HERE

my $i = 0;
while($ARGV[1] > $i){
    $i += 1;
    system("php avtest.php $ARGV[0] $ARGV[3] &");
    print "EXECUTING REQUEST $i\n";
    sleep $ARGV[2];
}

但是将命令行参数读入以它们所用的名称命名的变量更有意义,而不是依赖于记住参数排序。

转换中的简要勘误表:

我使用here字符串来表示多行文字。我也可以使用多个print语句来更接近地模仿bash版本

在bash中,参数作为编号变量访问,从$ 1开始向上。在Perl中,参数列表由数组@ARGV表示,该数组从零开始编号(与大多数语言中的数组一样)。在bash和Perl中,脚本的名称可以在变量$ 0中找到。

在引用整个数组时,Perl数组写为@arrayname,但在访问数组成员时,它们使用$ arrayname [index]。因此,Perl $list[0]就像bash ${list[0]}一样,Perl @list就像bash ${list[@]}

在Perl变量中使用my关键字声明; bash中的等价物是declare

我已经使用system函数来生成后台进程。它的参数可以只是命令行,因为你可以在bash中使用它。

echo不同,print需要告知是否应该在该行的末尾添加换行符。对于最新版本的Perl,存在say函数,它将为您附加换行符。

Perl sleep函数非常明显。

编辑:由于print语句中的拼写错误$i已被表示为$ni,导致运行时错误。这已经得到纠正。