¿Cuáles son las variables especiales de shell de signo de dólar?

782

En Bash, parece haber varias variables que contienen valores especiales de significado constante. Por ejemplo,

./myprogram &; echo $!

devolverá el PID del proceso que se encuentra en segundo plano myprogram. Sé de otros, como el $?que creo que es el TTY actual. ¿Hay otros?

Z Douglas
fuente
15
Varios de ellos no son solo Bash. También se usan en otros shells relacionados con Bourne y, de hecho, están especificados por POSIX .
Pausado hasta nuevo aviso.
1
Qué pasa con: IFS = $ '\ n' Consulte: stackoverflow.com/questions/4128235/…
sgu
1
@sgu Eso no es un parámetro; ese es un tipo especial de citas. $'\n'es un carácter literal de nueva línea que resulta de reemplazar el dígrafo \ncon ASCII 10.
chepner
Si usted vino aquí buscando ${1}, ${*}, etc, los tirantes son sólo para la desambiguación, ya menudo redundante. En forma aislada, ${x}es exactamente equivalente a $x.
tripleee
Que $!significa Soy consciente !$pero no eso.
Sridhar Sarnobat

Respuestas:

1360
  • $1` $2` $3, ... son los parámetros posicionales .
  • "$@"es una construcción de matriz-como de todos los parámetros posicionales, {$1, $2, $3 ...}.
  • "$*"es la expansión IFS de todos los parámetros posicionales, $1 $2 $3 ....
  • $# es el número de parámetros posicionales.
  • $- opciones actuales establecidas para el shell.
  • $$ pid del shell actual (no subshell).
  • $_ parámetro más reciente (o la ruta abs del comando para iniciar el shell actual inmediatamente después del inicio).
  • $IFS es el separador de campo (entrada).
  • $? es el estado de salida de canalización en primer plano más reciente.
  • $! es el PID del comando de fondo más reciente.
  • $0 es el nombre del shell o script de shell.

La mayor parte de lo anterior se puede encontrar en Parámetros especiales en el Manual de referencia de Bash. Existen todas las variables de entorno establecidas por el shell .

Para obtener un índice completo, consulte el Índice de variables del manual de referencia .

kojiro
fuente
2
Todos están documentados en la bashpágina del manual. La única rareza es que $_solo se menciona en el contexto de su uso en la MAILPATHvariable.
chepner
44
mirada @chepner en man(1) bashvirtud de parámetros especiales para el resto de la definición de $_.
kojiro
8
Lo uso en !$lugar de $_en scripts bash, porque este último a veces falla.
amc
Buena lista de kojiro. Me encontré con esta sintaxis $ {1 + "$ @"} ¿qué significa eso?
user178047
3
@amc: Consulte unix.stackexchange.com/questions/271659/… para ver las diferencias entre !$y $_.
tricasse
44
  • $_ último argumento del último comando
  • $# cantidad de argumentos pasados ​​al script actual
  • $*/ $@lista de argumentos pasados ​​al script como cadena / lista delimitada

la parte superior de mi cabeza. Google para bash variables especiales.

Dan
fuente
124
"Lo hice. Me enviaron aquí". - Skit de la librería (documento oficial: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo
1
Creo que $@es la cadena y $*es la lista delimitada (de todos modos, de acuerdo con la respuesta aceptada anteriormente).
RastaJedi
1
@RastaJedi: se "$@"expande a una lista, se "$*"expande a una sola cadena. El comportamiento especial de se $@aplica cuando está entre comillas dobles.
Keith Thompson
66
Voto negativo porque esta no es una respuesta muy completa o útil. Decir "Google it" muestra una falta de esfuerzo, especialmente teniendo en cuenta que la gran mayoría de las personas terminan aquí desde la búsqueda de Google. Creo que lo menos que puedes hacer es agregar enlaces a la documentación oficial. TBH, la única razón por la que no lo marqué para su eliminación fue porque es al menos una respuesta parcial a la pregunta. Sé que es viejo, pero considere editarlo para proporcionar más detalles.
Sean the Bean
15

Para ayudar a entender lo que no $#, $0y $1, ..., $nsí, yo uso este script:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

Ejecutarlo devuelve una salida representativa:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine
fedorqui 'así que deja de dañar'
fuente
44
¿Qué significa el! Me refiero en su bucle Es por eso que estoy aquí y no puedo encontrar una respuesta en ningún lado porque no sé cómo llamarla.
Anthony
77
@Anthony esto se llama indirección variable . Puede encontrar una buena explicación de su uso en bash: expansión indirecta, ¿por favor explique? .
Fedorqui 'SO deja de dañar'
3

Tenga cuidado con algunos de los ejemplos; $ 0 puede incluir alguna ruta principal, así como el nombre del programa. Por ejemplo, guarde este script de dos líneas como ./mytry.sh y ejecútelo.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

Salida:

parameter 0 --> ./mytry.sh

Esto está en una versión actual (año 2016) de Bash, a través de Slackware 14.2

Adrian Cole
fuente
55
Si $ 0 incluye una ruta o no, depende de cómo ejecutó el script en primer lugar. Si ejecutó "./mytry.sh", eso es lo que verá en $ 0. Si ingresó "~ / mytry.sh" verá la ruta completa (porque el shell se habrá expandido ~). Si hiciste ". Mytry.sh" verás 'bash'.
Steve Folly