¿Qué es $* y $# en Linux?
¿Qué significan las siguientes variables de entorno en Linux?
- ¿Qué es $* (signo de dólar seguido de un asterisco)?
- ¿Qué es $# (signo de dólar seguido de un asterisco/signo de número/octavo/signo de libra)?
¿Qué significan las siguientes variables de entorno en Linux?
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" ...).
Así que básicamente, $#
es un número de argumentos dados cuando su script fue ejecutado. $*
es una cadena que contiene todos los argumentos. Por ejemplo, $1
es el primer argumento y así sucesivamente. Esto es útil, si quieres acceder a un argumento específico en tu script.
Como comentó Brian, aquí hay un ejemplo sencillo. Si ejecutas el siguiente comando:
./command -yes -no /home/username
$#
= 3 $*
= -yes -no /home/username
$@
= array: {"-yes", "-no", "/home/username"}
$0
= ./command
, $1
= -yes
etc. Estos son parte del estándar POSIX , y deberían ser soportados por todos los shells que cumplan. Como referencia, a continuación están las definiciones del estándar POSIX para cada parámetro especial. Tenga en cuenta que hay tres variables adicionales: $-
, $$
y $!
.
$@
:
Expande a los parámetros posicionales, empezando por uno. Cuando la expansión ocurre dentro de comillas dobles, y cuando se realiza la división de campos (ver Field Splitting ), cada parámetro posicional se expandirá como un campo separado, con la disposición de que la expansión del primer parámetro se seguirá uniendo con la parte inicial de la palabra original (asumiendo que el parámetro expandido estaba incrustado dentro de una palabra), y la expansión del último parámetro se seguirá uniendo 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.
$*
:
Expande a los parámetros posicionales, empezando por uno. Cuando la expansión se produce dentro de una cadena entre comillas dobles (véase 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 si IFS no está establecido. Si IFS se establece como una cadena nula, esto no equivale a desestablecerla; 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 tubería más reciente (ver Pipelines ).
$-
:
(Guión.) Se expande a las banderas de opciones actuales (los nombres de opciones de una sola letra concatenados en una cadena) como se especifican en la invocación, por el comando especial incorporado set , o implícitamente por el shell.
$$
:
Se expande al ID de proceso decimal del shell invocado. En un subshell (ver Entorno de ejecución del 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 en segundo plano ejecutados desde subshells no afectan al valor de “$!” en el entorno del shell actual). Para una tubería, el ID del proceso es el del último comando en la tubería.
$0
:
(Cero.) Se expande al nombre del shell o del script del shell. Ver sh para una descripción detallada de cómo se obtiene este nombre.