¿Qué es $ * y $ # en Linux?

82

¿Qué significan las siguientes variables de entorno en Linux?

  1. ¿Qué es $ * (signo de dólar seguido de un asterisco)?
  2. ¿Qué es $ # (signo de dólar al lado de una marca hash / signo de número / octothorpe / libra)?
raghavayc
fuente

Respuestas:

115

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, $1es 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= -yesetc.

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.

Olli
fuente
1
Esos parámetros especiales son verdaderos en todos los shells derivados de Bourne (por ejemplo, sh, bash, dash, ash, ksh, zsh).
Dennis Williamson
Corrección: $*y $#son 1) variables de shell, no variables de entorno; 2) estandarizado (parte de la especificación POSIX)
grawity
3
También "$@"tenga en cuenta que muchas veces se escribe como ${1+"$@"}(por razones de portabilidad), consulte stackoverflow.com/questions/743454/… para obtener una explicación.
hlovdal
Dado que 'El nombre del comando (parámetro 0) no se contará ...', en el ejemplo anterior debería ser $ # = 2, comenzando a contar desde 0.
Josef Klimuk
0

$# representa el número de argumentos:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3
Vikk_King
fuente
2
Bienvenido a Super User. El sitio es una base de conocimiento, por lo que la intención es que cada respuesta brinde una solución a la pregunta que aún no se ha aportado. Esto solo aborda la mitad de la pregunta, y la información ya está bien cubierta en la respuesta anterior.
Fixer1234