Respuestas:
Desde aquí :
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
Básicamente, $#
hay una serie de argumentos dados cuando se ejecutó su script. $*
es una cadena que contiene todos los argumentos. Por ejemplo, $1
es el primer argumento y así sucesivamente. Esto es útil si desea acceder a un argumento específico en su secuencia de comandos.
Como comentó Brian, aquí hay un ejemplo simple. Si ejecuta el siguiente comando:
./command -yes -no /home/username
$#
= 3$*
= -yes -no /home/username
$@
= matriz: {"-yes", "-no", "/home/username"}
$0
= ./command
, $1
= -yes
etc.Estos son parte del estándar POSIX y deben ser compatibles con todos los shells compatibles. Como referencia, a continuación se encuentran las definiciones estándar POSIX para cada parámetro especial. Hacer la nota que hay tres variables adicionales: $-
, $$
y $!
.
$@
:
Se expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión se produce entre comillas dobles, y donde se realiza la división de campo (ver División de campo ), cada parámetro posicional se expandirá como un campo separado, con la condición de que la expansión del primer parámetro aún se unirá con la parte inicial de la palabra original (suponiendo que el parámetro expandido estaba incrustado dentro de una palabra), y la expansión del último parámetro aún se unirá con la última parte de la palabra original. Si no hay parámetros posicionales, la expansión de '@' generará cero campos, incluso cuando '@' esté entre comillas dobles.
$*
:
Se expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión se produce dentro de una cadena de comillas dobles (ver Comillas dobles ), se expandirá a un solo campo con el valor de cada parámetro separado por el primer carácter de la variable IFS, o por un IFS si no está establecido. Si IFS se establece en una cadena nula, esto no es equivalente a desarmarla; su primer carácter no existe, por lo que los valores de los parámetros se concatenan.
$#
:
Se expande al número decimal de parámetros posicionales. El nombre del comando (parámetro 0) no se contará en el número dado por '#' porque es un parámetro especial, no un parámetro posicional.
$?
:
Se expande al estado de salida decimal de la canalización más reciente (consulte Canalizaciones ).
$-
:
(Guión). Se expande a los indicadores de opción actuales (los nombres de opción de una sola letra concatenados en una cadena) como se especifica en la invocación, mediante el comando incorporado especial establecido , o implícitamente por el shell.
$$
:
Se expande al ID de proceso decimal del shell invocado. En un subshell (ver Entorno de ejecución de Shell ), '$' se expandirá al mismo valor que el del shell actual.
$!
:
Se expande al ID de proceso decimal del comando de fondo más reciente (ver Listas ) ejecutado desde el shell actual. (Por ejemplo, los comandos de fondo ejecutados desde subshells no afectan el valor de "$!" En el entorno de shell actual). Para una canalización, la ID del proceso es la del último comando en la canalización.
$0
:
(Cero.) Se expande al nombre del shell o script de shell. Consulte sh para obtener una descripción detallada de cómo se deriva este nombre.
$*
y $#
son 1) variables de shell, no variables de entorno; 2) estandarizado (parte de la especificación POSIX)
"$@"
tenga en cuenta que muchas veces se escribe como ${1+"$@"}
(por razones de portabilidad), consulte stackoverflow.com/questions/743454/… para obtener una explicación.
$#
representa el número de argumentos:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3