GNU/Linux >> Linux Esercitazione >  >> Linux

Che cosa significa ${1+"[email protected]"} in uno script shell e in che cosa differisce da "[email protected]"?

Nella documentazione Perl, perlrun(1) suggerisce di lanciare script Perl usando un'intestazione shell/Perl bilingue:

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

Che cosa significa ${1+"[email protected]"} significare? Ho provato a utilizzare "[email protected]" invece (usando Bash come /bin/sh), e sembra funzionare altrettanto bene.

Modifica

Due risposte di seguito dicono che dovrebbe essere ${1:+"[email protected]"} . Sono a conoscenza del ${parameter:+word} sintassi ("Usa valore alternativo") documentata in bash(1). Tuttavia, non sono convinto, perché

  1. Entrambi ${1+"[email protected]"} e "[email protected]" funzionano bene, anche quando non ci sono parametri. Se creo simple.sh come

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

    e question.sh come

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

    Posso far funzionare entrambi allo stesso modo:

    $ ./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. Anche altre fonti su Internet utilizzano ${1+"[email protected]"} , incluso un hacker che sembra sapere cosa sta facendo.

Forse ${parameter+word} è una sintassi alternativa (o obsoleta) non documentata per ${parameter:+word} ? Qualcuno potrebbe confermare questa ipotesi?

Risposta accettata:

Questo è per la compatibilità con la shell Bourne. La shell Bourne era una vecchia shell rilasciata per la prima volta con Unix versione 7 nel 1979 ed era ancora comune fino alla metà degli anni '90 come /bin/sh sulla maggior parte degli Unici commerciali.

È l'antenato della maggior parte dei conchiglie tipo Bourne come ksh , bash o zsh .

Aveva alcune caratteristiche imbarazzanti, molte delle quali sono state risolte in ksh e le altre shell e la nuova specifica standard di sh , uno dei quali è questo:

Con la shell Bourne (almeno quelle varianti in cui non è stato corretto):"[email protected]" si espande in un argomento vuoto se l'elenco dei parametri posizionali è vuoto ($# == 0 ) invece di nessun argomento.

${var+something} si espande in "qualcosa" a meno che $var non è impostato. È chiaramente documentato in tutte le shell ma è difficile da trovare in bash documentazione in quanto è necessario prestare attenzione a questa frase:

Quando non si esegue l'espansione della sottostringa, utilizzando i moduli documentati di seguito, bash verifica un parametro non impostato o nullo. L'omissione dei due punti determina un test solo per un parametro non impostato .

Quindi ${1+"[email protected]"} si espande in "[email protected]" solo se $1 è impostato ($# > 0 ) che aggira questa limitazione della shell Bourne.

Correlati:differenza tra EOT ed EOF?

Si noti che la shell Bourne è l'unica con questo problema. sh moderno s (ovvero sh conforme alla specifica POSIX di sh (che la shell Bourne non è)) non hanno questo problema. Quindi ne hai bisogno solo se hai bisogno che il tuo codice funzioni su sistemi molto vecchi dove /bin/sh potrebbe essere una shell Bourne invece di una shell standard (nota che POSIX non specifica la posizione dello standard sh , ad esempio su Solaris prima di Solaris 11, /bin/sh era ancora una shell Bourne (sebbene non avesse quel particolare problema) mentre il normale/standard sh era in un'altra posizione (/usr/xpg4/bin/sh )).

C'è un problema in quel perlrun perldoc in quel $0 non è citato però.

Vedi http://www.in-ulm.de/~mascheck/various/bourne_args/ per maggiori informazioni.


Linux
  1. Come si ftp e si scaricano file da uno script di shell UNIX

  2. Cosa sono gli script di shell? Come creare script di shell?

  3. Cosa significa il valore del simbolo dal comando nm?

  4. Che cosa significa [e-mail protetta] in uno script di shell?

  5. Cosa significa set -e in uno script bash?

Comando file Linux:cosa fa e come usarlo

Cosa significa null in Linux e nell'informatica

Cosa significa essere "sh compatibile"?

Che cos'è Podman e in che cosa differisce da Docker?

Come eseguire script Python dalla shell

Come creare ed eseguire uno script di shell in Ubuntu 22.04