GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué significa ${1+“[email protected]”} en un script de shell y en qué se diferencia de “[email protected]”?

En la documentación de Perl, perlrun(1) sugiere ejecutar secuencias de comandos de Perl utilizando un encabezado bilingüe de Shell/Perl:

#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"[email protected]"}'
    if 0;

¿Qué significa ${1+"[email protected]"} ¿significar? Intenté usar "[email protected]" en su lugar (usando Bash como /bin/sh), y parece funcionar igual de bien.

Editar

Dos respuestas a continuación dicen que se supone que es ${1:+"[email protected]"} . Soy consciente del ${parameter:+word} (“Usar valor alternativo”) sintaxis documentada en bash(1). Sin embargo, no estoy convencido, porque

  1. Ambos ${1+"[email protected]"} y "[email protected]" funciona bien, incluso cuando no hay parámetros. Si creo simple.sh como

    #!/bin/sh
    eval 'exec /usr/bin/perl -x -S -- $0 "[email protected]"'
        if 0;
    #!perl
    use Data::Dumper;
    print Dumper(\@ARGV);
    

    y question.sh como

    #!/bin/sh
    eval 'exec /usr/bin/perl -x -S -- $0 ${1+"[email protected]"}'
        if 0;
    #!perl
    use Data::Dumper;
    print Dumper(\@ARGV);
    

    Puedo hacer que ambos funcionen de manera idéntica:

    $ ./question.sh 
    $VAR1 = [];
    $ ./question.sh a
    $VAR1 = [
              'a'
            ];
    $ ./question.sh a 'b c'
    $VAR1 = [
              'a',
              'b c'
            ];
    $ ./question.sh ""
    $VAR1 = [
              ''
            ];
    $ ./simple.sh 
    $VAR1 = [];
    $ ./simple.sh a
    $VAR1 = [
              'a'
            ];
    $ ./simple.sh a 'b c'
    $VAR1 = [
              'a',
              'b c'
            ];
    $ ./simple.sh ""
    $VAR1 = [
              ''
            ];
    
  2. Otras fuentes en Internet también usan ${1+"[email protected]"} , incluido un hacker que parece saber lo que hace.

Quizás ${parameter+word} es una sintaxis alternativa no documentada (u obsoleta) para ${parameter:+word} ? ¿Alguien podría confirmar esa hipótesis?

Respuesta aceptada:

Eso es por compatibilidad con el shell Bourne. El shell Bourne era un shell antiguo que se lanzó por primera vez con la versión 7 de Unix en 1979 y aún era común hasta mediados de los 90 como /bin/sh en la mayoría de Unices comerciales.

Es el antepasado de la mayoría de las conchas tipo Bourne como ksh , bash o zsh .

Tenía algunas características extrañas, muchas de las cuales se han solucionado en ksh y los otros shells y la nueva especificación estándar de sh , uno de los cuales es este:

Con el shell de Bourne (al menos aquellas variantes en las que no se ha solucionado):"[email protected]" se expande a un argumento vacío si la lista de parámetros posicionales está vacía ($# == 0 ) en lugar de ningún argumento.

${var+something} se expande a "algo" a menos que $var está desarmado. Está claramente documentado en todos los shells pero es difícil de encontrar en bash documentación ya que debe prestar atención a esta oración:

Cuando no realice la expansión de subcadena, utilizando los formularios documentados a continuación, bash prueba un parámetro que no está establecido o es nulo. Omitir los dos puntos da como resultado una prueba solo para un parámetro que no está establecido .

Así que ${1+"[email protected]"} se expande a "[email protected]" solo si $1 está establecido ($# > 0 ) que soluciona esa limitación del shell Bourne.

Relacionado:¿Diferencia entre EOT y EOF?

Tenga en cuenta que el shell Bourne es el único shell con ese problema. sh moderno s (que es sh conforme a la especificación POSIX de sh (que el shell Bourne no es)) no tienen ese problema. Entonces solo necesita eso si necesita que su código funcione en sistemas muy antiguos donde /bin/sh podría ser un shell Bourne en lugar de un shell estándar (tenga en cuenta que POSIX no especifica la ubicación del sh estándar , por ejemplo en Solaris antes de Solaris 11, /bin/sh seguía siendo un shell Bourne (aunque no tenía ese problema en particular) mientras que el sh normal/estándar estaba en otra ubicación (/usr/xpg4/bin/sh )).

Hay un problema en eso perlrun página perldoc en ese $0 aunque no se cita.

Consulte http://www.in-ulm.de/~mascheck/various/bourne_args/ para obtener más información.


Linux
  1. ¿Qué significa `:-` en un script de Shell?

  2. ¿Qué significa -s y [[]] en una condición If en Bash?

  3. Cómo ejecutar scripts de Python desde shell

  4. ¿Cómo ftp y descargo archivos desde un UNIX Shell Script?

  5. ¿Qué son los scripts de Shell? ¿Cómo crear scripts de Shell?

Comando de archivo de Linux:qué hace y cómo usarlo

¿Qué significa nulo en Linux y Computación?

¿Qué significa ser "sh compatible"?

Cómo crear y ejecutar un script de shell en Ubuntu 22.04

¿Qué significa [correo electrónico protegido] en un script de shell?

¿Qué significa la sintaxis |&en lenguaje shell?