Как преобразовать операторы While/Case в bash в perl

Вот цикл в 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 &

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

this certainly helps, and i really appreciate it, is there any way to access these parameters outside the getOptions ? here is rest of the bash script:

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

напечатать "\n"; print "##################\n"; print "ЗАПУСК ЗАПРОСОВ\n"; напечатать "ИМЯ ХОСТА: \$HOST_NAME\n"; напечатать "ЦЕЛЬНАЯ СТРАНИЦА: \$TARGET_PAGE\n"; print " # АГЕНТЫ : \$NUM_AGENTS\n "; print "ВРЕМЯ ВЫПОЛНЕНИЯ: \$startTime (со случайным интервалом между 0 и \$TIME_STAGGER секунд)\n"; напечатать "REQ LOG FILE: $reqlogfile\n"; напечатать " ФАЙЛ ЖУРНАЛА RESP : $ resplogfile\n "; print "##################\n"; напечатать "\n"; # # самое высокоеНачало=$startTime

$startTime += $ARGV[0] + 5; мой $dTime = местное время ($ 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"); print "ЗАПУСК системы('php avtestTimed.php $ARGV[0] $ARGV[2] $startTime'); \n"; спать 1; }

# # 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 highStart=$procStartTime fi echo "СТАТУС: запрос в очередь $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 "СТАТУС: Ожидание готовности запросов в очереди" while [ date +%s -lt $startTime ] do sleep 1 done # echo "СТАТУС: Ожидание выдачи последнего запроса" while [ date +%s -lt $highestStart ] do sleep 1 done # echo "СОСТОЯНИЕ: Выдан последний ответ" # echo "СОСТОЯНИЕ: Ожидание создания файла журнала ответов" в то время как [ ! -e "$resplogfile" ] do sleep 1 done # while [ wc -l "$resplogfile"| awk '{print $1'} -lt $NUM_AGENTS ] do #echo "(wc -l "$resplogfile"| awk '{print $1'} из $NUM_AGENTS ответов)" sleep 1 done echo "СТАТУС: ЗАВЕРШЕНО"

пока верно; do read -p "Вы хотите просмотреть журнал запросов? [y/n]" yn case $yn in [Yy]* ) cat $reqlogfile; ломать;; [Nn]* ) выход;; * ) echo "Пожалуйста, ответьте да или нет.";; esac сделано

пока верно; do read -p "Вы хотите просмотреть журнал ответов? [y/n]" yn case $yn in [Yy]* ) cat $resplogfile; ломать;; [Nn]* ) выход;; * ) echo "Пожалуйста, ответьте да или нет.";; эсак сделано


person kamal    schedule 28.12.2010    source источник
comment
Вы должны взглянуть на встроенную функцию Bash getopts, хотя она не обрабатывает многосимвольные параметры. С осторожностью можно использовать внешнюю утилиту getopt, которая обрабатывает длинные опции.   -  person Dennis Williamson    schedule 28.12.2010


Ответы (1)


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} &");
person DVK    schedule 28.12.2010