GNU/Linux >> Znalost Linux >  >> Linux

Co znamená ${1+“[email protected]”} ve skriptu Shell a jak se liší od „[email protected]“?

V dokumentaci Perl perlrun(1) navrhuje spouštění skriptů Perl pomocí dvojjazyčného shellu/perlovské hlavičky:

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

Co znamená ${1+"[email protected]"} znamenat? Zkusil jsem použít "[email protected]" místo toho (pomocí Bash jako /bin/sh) a zdá se, že to funguje stejně dobře.

Upravit

Dvě odpovědi níže říkají, že by to mělo být ${1:+"[email protected]"} . Jsem si vědom ${parameter:+word} (“Použít alternativní hodnotu”) syntaxe zdokumentovaná v bash(1). Nejsem však přesvědčen, protože

  1. Oba ${1+"[email protected]"} a "[email protected]" fungují dobře, i když nejsou žádné parametry. Pokud vytvořím simple.sh jako

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

    a question.sh jako

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

    Mohu přimět oba, aby fungovaly identicky:

    $ ./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. Jiné zdroje na internetu také používají ${1+"[email protected]"} , včetně jednoho hackera, který, jak se zdá, ví, co dělá.

Možná ${parameter+word} je nezdokumentovaná alternativní (nebo zastaralá) syntaxe pro ${parameter:+word} ? Mohl by někdo potvrdit tuto hypotézu?

Přijatá odpověď:

To kvůli kompatibilitě s Bourne shellem. Bourne shell byl starý shell, který byl poprvé vydán s Unixem verze 7 v roce 1979 a byl stále běžný až do poloviny 90. let jako /bin/sh na většině komerčních Unices.

Je předkem většiny skořápek podobných Bourne jako ksh , bash nebo zsh .

Měl několik nepříjemných funkcí, z nichž mnohé byly opraveny v ksh a další shelly a nová standardní specifikace sh , z nichž jeden je tento:

S Bourne shellem (alespoň ty varianty, kde to nebylo opraveno):"[email protected]" Pokud je seznam pozičních parametrů prázdný, nahradí se jedním prázdným argumentem ($# == 0 ) místo žádného argumentu.

${var+something} expanduje na „něco“, pokud není $var není nastaveno. Je jasně zdokumentován ve všech shellech, ale těžko se hledá v bash dokumentaci, protože musíte věnovat pozornost této větě:

Když neprovádíte rozšiřování podřetězců, pomocí formulářů popsaných níže, bash testuje parametr, který není nastaven nebo má hodnotu null. Vynechání dvojtečky vede k testu pouze pro parametr, který není nastaven .

Takže ${1+"[email protected]"} se rozšíří na "[email protected]" pouze pokud $1 je nastaveno ($# > 0 ), který toto omezení Bourne shellu obchází.

Související:Rozdíl mezi EOT a EOF?

Všimněte si, že Bourne shell je jediný shell s tímto problémem. Moderní sh s (to je sh vyhovující specifikaci POSIX sh (což Bourne shell není)) tento problém nemají. Takže to potřebujete pouze v případě, že potřebujete, aby váš kód fungoval na velmi starých systémech, kde je /bin/sh může být Bourne shell namísto standardního shellu (všimněte si, že POSIX nespecifikuje umístění standardního sh , takže například na Solarisu před Solaris 11, /bin/sh byl stále Bourne shell (ačkoli neměl tento konkrétní problém), zatímco normální/standardní sh byl na jiném místě (/usr/xpg4/bin/sh )).

V tomto perlrun je problém perldoc stránku v této $0 není však citován.

Více informací naleznete na http://www.in-ulm.de/~mascheck/various/bourne_args/.


Linux
  1. Co znamená [email protected] ve skriptu shellu?

  2. Co znamená set -e ve skriptu bash?

  3. Co znamená syntaxe |&v jazyce shellu?

  1. Co je Makefile a jak funguje?

  2. Jak porovnávat čísla a řetězce ve skriptu Linux Shell

  3. Co znamená `:-` ve skriptu Shell?

  1. Co znamená Ampersand na konci řádku skriptu Shell?

  2. Co znamená -s a [[]] ve stavu If v Bash?

  3. Co je Podman a jak se liší od Dockeru?