Как конвертировать операторы While / Case в bash в perl - PullRequest
0 голосов
/ 28 декабря 2010

Вот цикл в bash:

  while [ $# -ge 1 ]; do
    case $1 in
    -a)
      shift
      NUM_AGENTS=$1
      ;;
    -h)
      shift
      HOST_NAME=$1
      ;;
    -t)
      shift
      TIME_STAGGER=$1
      ;;
    -un)
      shift
      USER_NAME=$1
      ;;
    -pw)
      shift
      USER_PASS=$1
      ;;
    -p)
      shift
      TARGET_PAGE=$1
      ;;
    -s)
      shift
      COMMON_SID=$1
      ;;
    esac
    shift
  done

Как я могу преобразовать это в perl, чтобы аргумент заполнял значения в командной строке

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

------- добавлено в вопрос:

это, безусловно, помогает, и я действительно ценю это, есть ли способ получить доступ к этим параметрам вне getOptions? вот остальная часть скрипта bash:

my $i="0";
my $startTime=<code>date +%s</code>;
startTime=$[$startTime+$NUM_AGENTS+10]
my $PWD=<code>pwd</code>;
my $logdir="\$PWD/load-logs";
system(mkdir $logdir/$startTime);
my $reqlogfile="$logdir/$startTime/req.log";
my $resplogfile="$logdir/$startTime/resp.log";</p>

<p>print "\n";
print "##################\n";
print "LAUNCHING REQUESTS\n";
print "  HOST NAME      :  \$HOST_NAME\n ";
print "  TARGET PAGE    :  \$TARGET_PAGE\n ";
print "  # AGENTS       :  \$NUM_AGENTS\n ";
print "  EXECUTION TIME :  \$startTime (with random stagger between 0 and \$TIME_STAGGER seconds)\n ";
print "  REQ LOG FILE   :  $reqlogfile\n ";
print "  RESP LOG FILE  :  $resplogfile\n ";
print "##################\n";
print "\n";
#
#
highestStart=$startTime</p>

<p>$startTime += $ARGV[0] + 5;
my $dTime = localtime( $startTime );
print "\n##################\nLAUNCHING REQUESTS\n 
       COUNT: $ARGV[0]\n 
       DELAY: | 1 \n
       The scripts will fire at : $dTime\n##################\n\n";
while ( $ARGV[0] > $i )
{
    $i++;
    system("php avtestTimed.php $ARGV[0] $ARGV[2] $startTime");
    print "RUN system('php avtestTimed.php $ARGV[0] $ARGV[2] $startTime'); \n";
    sleep 1;
}</p>

<p>#
#
while [ $NUM_AGENTS -gt "$i" ]
do
  i=$[$i+1]
  execDelay=$((RANDOM % $TIME_STAGGER))"."$((RANDOM % 100))
  procStartTime=$[$startTime]
  procStartTime=$[$startTime+$execDelay]
  if [ $procStartTime -gt $highestStart ]
  then
    highestStart=$procStartTime
  fi
  echo "STATUS: Queueing request $i with a delay of $execDelay seconds"</p>

<h2>echo " '--> COMMAND: php loadAgent_curl.php $NUM_AGENTS $HOST_NAME $procStartTime $i $TARGET_PAGE $reqlogfile $resplogfile $USER_NAME $USER_PASS $execDelay $COMMON_SID"</h2>

<p>php loadAgent_curl.php $NUM_AGENTS $HOST_NAME $procStartTime $i $TARGET_PAGE $reqlogfile $resplogfile $USER_NAME $USER_PASS $execDelay $COMMON_SID &
  sleep 1
done</p>

<p>echo "STATUS: Waiting for queued requests to be ready"
while [ <code>date +%s</code> -lt $startTime ]
do
  sleep 1
done
#
echo "STATUS: Waiting for last request to issue"
while [ <code>date +%s</code> -lt $highestStart ]
do
  sleep 1
done
#
echo "STATUS: Last response issued"
#
echo "STATUS: Waiting for response log file to be created"
while [ ! -e "$resplogfile" ]
do
 sleep 1
done
#
while [ <code>wc -l "$resplogfile"| awk '{print $1'}</code> -lt $NUM_AGENTS ]
do
  #echo "(<code>wc -l "$resplogfile"| awk '{print $1'}</code> of $NUM_AGENTS responses recorded)"
  sleep 1
done
echo "STATUS: FINISHED"</p>

<p>while true; do
    read -p "Do you wish to view the request log? [y/n]" yn
    case $yn in
        [Yy]* ) cat $reqlogfile; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done</p>

<p>while true; do
    read -p "Do you wish to view the response log? [y/n]" yn
    case $yn in
        [Yy]* ) cat $resplogfile; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

1 Ответ

2 голосов
/ 28 декабря 2010

Getopt::Long библиотека - это стандартный 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} &");
...