Разбор команды командной строки php, howto

Я использую Console_Getopt в PHP 5.2 и нахожу удивительным то, насколько он отличается от getopt на других языках (perl, bash, java). Может ли кто-нибудь порекомендовать как анализировать аргументы из массива «$ opts»?

php myprog.php -a varA -c -b varB

$o= new Console_Getopt; $opts = $o->getopt($argv, "a:b:c"); print_r($opts); 

// print_r возвращается ниже

 Array ( [0] => Array ( [0] => Array ( [0] => a [1] => varA ) [1] => Array ( [0] => c [1] => ) [2] => Array ( [0] => b [1] => varB ) ) [1] => Array ( ) ) 

Я начал делать что-то вроде ниже, что долгое время, поэтому я ищу предложения по работе с флагами командной строки в php.

 foreach($opts[0] as $i -> $keyval) { list($key, $val) = $keyval; if($key == 'a') { print "valueForA: $val\n"; } else if($key == 'b') { print "valueForB: $val\n"; } else if($key == 'c') { print "c is set\n"; } } 

Интересно, почему getopt PHP не похож на perl, где ключ массива – это флаг, например $ opts {'a'} .. это было бы удобно.

Solutions Collecting From Web of "Разбор команды командной строки php, howto"

По встроенной документации

Возвращаемое значение представляет собой массив из двух элементов: список проанализированных опций и список аргументов командной строки без опций. Каждая запись в списке проанализированных опций представляет собой пару элементов – первая указывает параметр, а вторая – аргумент параметра, если таковой был.

Это означает, что вы легко отбрасываете второй массив и берете на себя обязательство хранить массив массивов, параметр первого элемента, значение второго элемента, формат.

Исходя из этого предположения, попробуйте

 $o= new Console_Getopt; $opts = $o->getopt($argv, "a:b:c"); print_r(getHashOfOpts($opts)); function getHashOfOpts($opts) { $opts = $opts[0]; $return_opts = $opts; $return_opts = Array(); foreach($opts as $pair){ $return_opts[$pair[0]] = $pair[1]; } return $return_opts; } 

чтобы получить структуру данных по своему вкусу.

Что касается того, почему это отличается от другой реализации getopt, спросите у сопровождающих .

Проверьте GetOptionKit для PHP:

https://github.com/c9s/php-GetOptionKit

конспект

 use GetOptionKit\OptionCollection; use GetOptionKit\OptionParser; $options = new OptionCollection; $options->add( 'f|foo:' , 'option require value' ); # returns spec object. $options->add( 'b|bar+' , 'option with multiple value' ); $options->add( 'z|zoo?' , 'option with optional value' ); $options->add( 'f|foo:=i' , 'option require value, with integer type' ); $options->add( 'f|foo:=s' , 'option require value, with string type' ); $options->add( 'v|verbose' , 'verbose flag' ); $options->add( 'd|debug' , 'debug flag' ); $parser = new OptionParser($options); $result = $parser->parse( array( 'program' , '-f' , 'foo value' , '-v' , '-d' ) ); $spec = $result->verbose; $spec = $result->debug; $spec->value; # get value 

GetOptionKit \ OptionPrinter может печатать варианты для вас:

 * Available options: -f, --foo option requires a value. -b, --bar option with multiple value. -z, --zoo option with optional value. -v, --verbose verbose message. -d, --debug debug message. --long long option name only. -s short option name only. 

Я написал класс оболочки вокруг getopt (), аналогичный Console_GetOpt, но я думаю немного лучше.

Вы можете найти его здесь: http://github.com/pete-otaqui/ClipClop

Парсер PHP, основанный на getopt ().

ClipClop позволяет вам легко создавать инструменты командной строки с параметрами. ClipClop автоматически генерирует хорошо отформатированные инструкции по использованию, а также предоставляет удобный API для доступа к параметрам и значениям.

ClipClop обрабатывает необходимые и необязательные параметры и значения для них. Таким образом, данный параметр, такой как «–verbose», может быть необходим или необязательный сам по себе, и он не может иметь никакого значения параметра или необязательного или требуемого.

ClipClop управляет несколькими значениями, хотя по умолчанию использует одиночные значения, может проверять правильные выражения и может анализировать определенные типы для вас: целые числа, числа, json и urls.

Быстрый пример Создайте скрипт под названием «environment_test» со следующим кодом

 #!/usr/bin/env php <?php // do this unless you have setup an Autoloader require_once('/path/to/ClipClop.php'); $clipclop = new ClipClop(); $clipclop->addOption(array( 'short' => 'e', // shortname, ie "-e" 'long' => 'environment', // longname, ie "--environment" 'value' => TRUE, // A value must be given such as "--environment=TEST" 'help' => 'Set the environment', // help text for the 'usage' text 'required' => TRUE, // Environment must be provided )); // as soon as we ask for an option, ClipClop will parse CLI arguments with getopt() $environment = $clipclop->getOption('e'); // returns the value set for 'e' OR 'environment' print "You ran this script with environment: $environment"; ?> 

Он включает в себя различные другие варианты и модульные тесты.

Для чего это стоит, я недавно взломал небольшой собственный проект для анализа параметров командной строки в PHP. Я называю это Pharse (например, «PHP Parse» … вроде). Он доступен для загрузки на github здесь:

https://github.com/chrisallenlane/Pharse

Это было так сильно вдохновлено Trollop, что вы могли почти считать его портом, хотя я не реализовал все функции, которые имеет Trollop. (Мне не нужны некоторые функции – например, подкоманды – для моих собственных целей, поэтому я не беспокоился).

Общий смысл библиотеки заключается в том, что ее использование предполагает использование одного базового файла, а затем передачу класса Pharse в один ассоциативный массив параметров. Например:

  <?php # specify some options $options = array( 'user_name' => array( 'description' => 'Your username', 'default' => 'admin', 'type' => 'string', 'required' => true, 'short' => 'u', ), 'password' => array( 'description' => 'Your password', 'default' => 'sexsecretlovegod', 'type' => 'string', 'required' => true, ), ); # You may specify a program banner thusly: $banner = "This program logs you in to the Gibson."; Pharse::setBanner($banner); # After you've configured Pharse, run it like so: $opts = Pharse::options($options); ?> 

Я написал сообщение в блоге, представляющее библиотеку здесь:

http://chris-allen-lane.com/2012/03/pharse-a-library-for-php-command-line-option-parsing/

Я взломал библиотеку для случайного использования для моих личных проектов, поэтому я должен проявлять осторожность перед тем, как развернуть этот сценарий в производственной среде. Я даже не успел реализовать надлежащие модульные тесты, так что будьте осторожны.

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