Quali sono le speciali variabili shell simbolo del dollaro?


782

In Bash, sembrano esserci diverse variabili che contengono valori speciali con significati coerenti. Per esempio,

./myprogram &; echo $!

restituirà il PID del processo in background myprogram. Conosco altri, come quello $?che penso sia l'attuale TTY. Ce ne sono altri?


15
Molti di loro non sono solo Bash. Sono anche usati in altre shell relative a Bourne e in effetti sono specificati da POSIX .
In pausa fino a nuovo avviso.

1
Che dire: IFS = $ '\ n' Vedi: stackoverflow.com/questions/4128235/…
sgu

1
@sgu Non è un parametro; questo è un tipo speciale di quotazione. $'\n'è un letterale personaggio newline che risulta dalla sostituzione del digraph \ncon ASCII 10.
chepner

Se sei arrivato qui alla ricerca di ${1}, ${*}ecc, le parentesi graffe sono solo per disambiguazione, e spesso ridondante. In isolamento, ${x}è esattamente equivalente a $x.
Triplo

Cosa $!significa? Sono consapevole !$ma non quello.
Sridhar Sarnobat,

Risposte:


1360
  • $1, $2, $3, ... sono i parametri posizionali .
  • "$@"è un costrutto array come di tutti i parametri posizionali, {$1, $2, $3 ...}.
  • "$*"è l'espansione IFS di tutti i parametri posizionali, $1 $2 $3 ....
  • $# è il numero di parametri posizionali.
  • $- opzioni correnti impostate per la shell.
  • $$ pid della shell corrente (non subshell).
  • $_ parametro più recente (o il percorso abs del comando per avviare la shell corrente immediatamente dopo l'avvio).
  • $IFS è il separatore di campo (input).
  • $? è lo stato di uscita della pipeline in primo piano più recente.
  • $! è il PID del comando in background più recente.
  • $0 è il nome della shell o dello script della shell.

La maggior parte di quanto sopra è disponibile in Parametri speciali nel Manuale di riferimento di Bash. Ci sono tutte le variabili d'ambiente impostate dalla shell .

Per un indice completo, consultare l' indice delle variabili del manuale di riferimento .


2
Sono tutti documentati nella bashpagina man. L'unica stranezza è che $_è menzionata solo nel contesto del suo uso nella MAILPATHvariabile.
Chepner,

4
sguardo @chepner in man(1) bashsotto Parametri speciali per il resto della definizione di $_.
Kojiro,

8
Uso !$invece di $_script bash, perché quest'ultimo a volte fallisce.
amc

Bella lista kojiro. Ho riscontrato questa sintassi $ {1 + "$ @"} che cosa significa?
user178047

3
@amc: vedi unix.stackexchange.com/questions/271659/… per le differenze tra !$e $_.
tricasse il

44
  • $_ ultimo argomento dell'ultimo comando
  • $# numero di argomenti passati allo script corrente
  • $*/ $@elenco di argomenti passati allo script come stringa / elenco delimitato

dalla cima della mia testa. Google per bash variabili speciali.


124
"L'ho fatto. Mi hanno mandato qui." - Skit bookshop (documento ufficiale: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo

1
Penso che $@sia la stringa ed $*è l'elenco delimitato (secondo la risposta accettata sopra, comunque).
RastaJedi,

1
@RastaJedi: si "$@"espande in un elenco, si "$*"espande in una singola stringa. Il comportamento speciale di si $@applica quando è racchiuso tra virgolette doppie.
Keith Thompson,

6
Sottovalutato perché questa non è una risposta molto completa o utile. Dire "Google it" mostra una mancanza di sforzo, soprattutto considerando che la stragrande maggioranza delle persone finisce qui dalla ricerca di Google. Penso che il minimo che tu possa fare è aggiungere collegamenti alla documentazione ufficiale. TBH, l'unica ragione per cui non l'ho contrassegnato per la cancellazione era perché è almeno una risposta parziale alla domanda. So che è vecchio, ma per favore considera di modificarlo per fornire maggiori dettagli.
Sean the Bean,

15

Per aiutare a capire che cosa $#, $0e $1, ..., $nfaccio, io uso questo script:

#!/bin/bash

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

Eseguendolo restituisce un output rappresentativo:

$ ./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

4
Cosa significa! Intendo nel tuo ciclo for? Ecco perché sono qui e non riesco a trovare una risposta da nessuna parte perché non so come chiamarla.
Anthony,

7
@Anthony questo si chiama indiretta variabile . Puoi trovare una buona spiegazione del suo utilizzo in bash: espansione indiretta, per favore spiegami? .
fedorqui "SO smettere di danneggiare"

3

Abbi cura di alcuni degli esempi; $ 0 può includere alcuni percorsi iniziali e il nome del programma. Ad esempio, salvare questo script a due righe come ./mytry.sh e eseguirlo.

#!/bin/bash

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

Produzione:

parameter 0 --> ./mytry.sh

Questo è su una versione corrente (anno 2016) di Bash, tramite Slackware 14.2


5
Il fatto che $ 0 includa o meno un percorso dipende in primo luogo da come è stato eseguito lo script. Se hai eseguito "./mytry.sh" è quello che vedrai in $ 0. Se hai inserito "~ / mytry.sh" vedrai il percorso completo (perché la shell sarà espansa ~). Se hai fatto ". Mytry.sh" vedrai "bash".
Steve Folly,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.