Parámetros Línea de Comandos. PHP
SOLUCIONARIO
Parámetros Línea de Comandos. PHP
2026-02-22
Por
Occam's Razor

#!/usr/bin/php -f
<?php
printf ("%d parámetros\n", $argc);

for ($i = 0; $i < $argc; $i++)
    printf ("Parametro %d -> %s\n", $i, $argv[$i]);
if ($argc != 2) {
    fprintf (STDERR, "Solo un parámetro por favor\n");
    exit (1);
}
printf ("Hola %s\n", $argv[1]);


?>

PHP, ofrece un interfaz similar a C y Perl como suele ser habitual, utiliza una variable con el número de parámetros y otra que contiene una matriz con todos los parámetros recibidos desde la línea de comandos.

En PHP, el primer elemento de la matriz es el nombre del script que hemos ejecutado.

SABÍAS QUE?

En PHP no podemos modificar el nombre de nuestro script que ps muestra simplemente modificando el valor de $argv[0], sin embargo, podemos utilizar cli_set_process_title() para ello. Sin embargo, esto solo funciona en la versión CLI SAPI (en una página web tampoco tiene tanto sentido) y PHP debe haber sido compilaod con soporte para ello.

PHP dispone de un módulo similar a getopt pero con algunas limitaciones. La principal es que, aun cuando podemos utilizar parámetros largos y cortos, la versión PHP de getopt los trata de forma separada, de forma que tenemos que hacer un poco más de trabajo. La otra es que getopt no genera errores automáticamente si, por ejemplo, un determinado flag no incluye su valor.

A continuación mostramos un sencillo ejemplo que soluciona el primero de los problemas, pero no el segundo que haría el código bastante más largo:

#!/usr/bin/env php
<?php

// Parse options
$options = getopt("hi:o:", ["help", "input:", "output:"]);

$noptions = [
  'h' => $options['h']   ?? $options['help'] ?? false,
  'i' => $options['i']   ?? $options['input'] ?? "input.txt",
  'o' => $options['o']   ?? $options['output'] ?? "output.txt",
];

//var_dump ($noptions);
// Help requested
if (isset($options['h']) || isset($options['help'])) {
  $script = basename($argv[0]);
  
  echo <<<USAGE
  Usage:
       php {$script} [options]
  
  Options:
      -h, --help              Show this help message
      -i, --input <file>      Input file (default: input.txt)
      -o, --output <file>     Output file (default: output.txt)
  
  USAGE;
  exit(0);
}
// Input file
$inputFile = $noptions['i'];
$outputFile = $noptions['o'];


// Show result
echo "Input file:  {$inputFile}" . PHP_EOL;
echo "Output file: {$outputFile}" . PHP_EOL;
?>

Para unificar los argumentos cortos y largo, creamos una nueva tabla hash en la que, con la ayuda del operador ?? unificamos los valores en una misma clave.

SOY NOVATO

El operador ?? es equivalente al siguiente código:

$foo = $bar ?? "valor por defecto";
$foo = isset ($bar) ? $bar : "valor por defecto";

Que como podéis ver es bastante más corto.

Procesar todos los posibles errores no es especialmente complicado, pero si tedioso y requiere bastante código. Razón por la que no incluimos un ejemplo completo. Por ejemplo, si pasamos el argumento -o que requiere un parámetro sin parámetro, el valor no se incluye en el hashtable options, con lo cual debemos buscar primero si el argumento se pasó en la lista original de argumentos y luego comparar con el resultado de getopt.

RESUMEN

  • PHP recibe los argumentos usando dos variables. argc contiene el número de argumentos recibidos, y argv la lista de ellos
  • Los argumentos se reciben como un array de cadenas de caracteres
  • PHP ofrece un módulo getopt para procesar los argumentos de la línea de comandos más fácilmente.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)