0

这是bash中的循环:

  而 [ $# -ge 1 ]; 做
    案例 1 美元
    -一个)
      转移
      NUM_AGENTS=$1
      ;;
    -H)
      转移
      主机名=$1
      ;;
    -t)
      转移
      TIME_STAGGER=$1
      ;;
    -联合国)
      转移
      用户名=$1
      ;;
    -pw)
      转移
      USER_PASS=$1
      ;;
    -p)
      转移
      TARGET_PAGE=$1
      ;;
    -s)
      转移
      COMMON_SID=$1
      ;;
    经社理事会
    转移
  完毕

我如何在 perl 中转换它,以便参数填充命令行中的值

php loadAgent_curl.php $NUM_AGENTS $HOST_NAME $procStartTime $i $TARGET_PAGE $reqlogfile $resplogfile $USER_NAME $USER_PASS $execDelay $COMMON_SID &

-------- 附加到问题:

这当然有帮助,我真的很感激,有没有办法在 getOptions 之外访问这些参数?这是 bash 脚本的其余部分:

我的 $i="0";
我的 $startTime= date +%s;
开始时间=$[$开始时间+$NUM_AGENTS+10]
我的 $PWD= pwd;
我的 $logdir="\$PWD/load-logs";
系统(mkdir $logdir/$startTime);
我的 $reqlogfile="$logdir/$startTime/req.log";
我的 $resplogfile="$logdir/$startTime/resp.log";

打印“\n”; 打印 "##################\n"; 打印“启动请求\n”; 打印“主机名:\$HOST_NAME\n”; 打印“目标页面:\$TARGET_PAGE\n”; 打印“#代理:\$NUM_AGENTS\n”; print " EXECUTION TIME : \$startTime (随机错开在 0 和 \$TIME_STAGGER 秒之间)\n "; 打印“请求日志文件:$reqlogfile\n”; 打印 " RESP 日志文件 : $resplogfile\n "; 打印 "##################\n"; 打印“\n”; # # 最高开始=$startTime

$startTime += $ARGV[0] + 5; 我的 $dTime = localtime( $startTime ); print "\n##################\n启动请求\n 计数:$ARGV[0]\n 延迟:| 1 \n 脚本将在以下位置触发:$dTime\n##################\n\n"; 而 ( $ARGV[0] > $i ) { $i++; system("php avtestTimed.php $ARGV[0] $ARGV[2] $startTime"); 打印“运行系统('php avtestTimed.php $ARGV[0] $ARGV[2] $startTime');\n”; 睡觉1; }

# # 而 [ $NUM_AGENTS -gt "$i" ] 做 我=$[$i+1] execDelay=$((RANDOM % $TIME_STAGGER))"."$((RANDOM % 100)) procStartTime=$[$startTime] procStartTime=$[$startTime+$execDelay] 如果 [ $procStartTime -gt $highestStart ] 然后 最高开始=$procStartTime 菲 echo "STATUS: 排队请求 $i 延迟 $execDelay 秒"

echo " '--> 命令:php loadAgent_curl.php $NUM_AGENTS $HOST_NAME $procStartTime $i $TARGET_PAGE $reqlogfile $resplogfile $USER_NAME $USER_PASS $execDelay $COMMON_SID"

php loadAgent_curl.php $NUM_AGENTS $HOST_NAME $procStartTime $i $TARGET_PAGE $reqlogfile $resplogfile $USER_NAME $USER_PASS $execDelay $COMMON_SID & 睡觉 1 完毕

echo "状态:等待排队的请求准备好" 而 [ date +%s-lt $startTime ] 做 睡觉 1 完毕 # echo "状态:等待最后一个请求发出" 而 [ date +%s-lt $highestStart ] 做 睡觉 1 完毕 # 回声“状态:发出最后一个响应” # echo "状态:等待创建响应日志文件" 尽管 [ !-e "$resplogfile" ] 做 睡觉 1 完毕 # 而 [ wc -l "$resplogfile"| awk '{print $1'}-lt $NUM_AGENTS ] 做 #echo "(wc -l "$resplogfile"| awk '{print $1'}记录了 $NUM_AGENTS 个回复)" 睡觉 1 完毕 回声“状态:完成”

虽然是真的;做 read -p "你想查看请求日志吗?[y/n]" yn 案例 $yn 在 [Yy]* ) 猫 $reqlogfile; 休息;; [Nn]* ) 退出;; * ) echo "请回答是或否。";; 经社理事会 完毕

虽然是真的;做 read -p "你想查看响应日志吗?[y/n]" yn 案例 $yn 在 [Yy]* ) 猫 $resplogfile; 休息;; [Nn]* ) 退出;; * ) echo "请回答是或否。";; 经社理事会 完毕

4

1 回答 1

2

Getopt::Longlibrary 是处理命令行选项的标准 Perl 方法。

像这样的东西会起作用。未经测试 - 警告购买者!

请注意,由于您的 PHP 参数是命令行选项和一些未识别变量的混合,因此我设计了第一个示例,以便所有可能的选项都应该存储在%args哈希中(例如,您的程序应该使用$args{procStartTime}而不是$procStartTime)。这让我可以让它变得非常简短和通用。如果这很难阅读/理解,我还有第二个例子,它更简单但不太通用

use Getopt::Long;
my @php_arg_order = qw(a h procStartTime i p reqlogfile 
                       resplogfile un pw execDelay s);

my %args = map {$_ => ""} @php_arg_order;

$args{procStartTime} = "something";
$args{reqlogfile} = "a.log"; 
# More defaults for variables NOT passed in via command line. 
# Populate them all in %args as above.

# Now load actual command line parameters.
GetOptions(\%args, map { "$_=s" } @php_arg_order) or die "Unknown parameter!\n";

system(join(" ", 
            "php", "loadAgent_curl.php",map { $args{$_} } @php_arg_order}, "&"));

第二个不太高级但更直接的选择是:

use Getopt::Long;

my %args = ();

# Now load actual command line parameters.
GetOptions(\%args, 
   "NUM_AGENTS|a=s"
  ,"HOST_NAME|h=s"
  ,"USER_NAME|un=s"
  # ... the rest of options
  # The "XXX|x" notaion allows using alias "-x" parameter
  # but stores in $args{XXX} instead for better readability
) or die "Unknown parameter!\n";

system("php loadAgent_curl.php $args{NUM_AGENTS} $args{HOST_NAME} $procStartTime $i $args{TARGET_PAGE} $reqlogfile $resplogfile $args{USER_NAME} $args{USER_PASS} $execDelay $args{COMMON_SID} &");
于 2010-12-28T17:20:45.633 回答