2015-05-26 53 views
5

Stavo guardando il seguente codice e ho scoperto che sia $ # che $ {# @} stampano lo stesso valore. Qualcuno potrebbe dirmi qual è la differenza tra i due?

# length.sh 

E_NO_ARGS=65 

if [ $# -eq 0 ] # Must have command-line args to demo script. 
then 
    echo "Please invoke this script with one or more command-line arguments." 
    exit $E_NO_ARGS 
fi 

var01=abcdEFGH28ij 
echo "var01 = ${var01}" 
echo "Length of var01 = ${#var01}" 
# Now, let's try embedding a space. 
var02="abcd EFGH28ij" 
echo "var02 = ${var02}" 
echo "Length of var02 = ${#var02}" 

echo "Number of command-line arguments passed to script = ${#@}" 
echo "Number of command-line arguments passed to script = $#" 

exit 0 
+3

praticamente non credo ci sia alcuna differenza. '$ #' è il numero di argomenti della riga di comando, '$ @' è effettivamente una matrice di argomenti della riga di comando, e '$ {# @}' è la lunghezza di questo array - dovrebbero avere lo stesso valore. –

+3

Si noti che il fatto che '$ {# @}' si espande al numero di parametri posizionali è un bashismo. Lo standard POSIX lascia '$ {# @}' e '$ {# *}' indefinito. – chepner

risposta

8

Per pagina manuale (3.5.3 Shell Parameter Expansion):

${#parameter}

Lunghezza dei parametri. La lunghezza in caratteri del valore del parametro è sostituita. Se il parametro è * o @, il valore sostituito è il numero di parametri posizionali. Se parametro è un nome di matrice indicato da * o @, il valore sostituito è il numero di elementi nella matrice.

Così ${#@} è solo un caso particolare in quanto $# è il solito modo di esprimere il numero di parametri posizionali.