Perché $ {$ #} restituisce lo stesso risultato di $$ nella shell?


18

Durante il tentativo di ottenere l'ultimo parametro posizionale impostato /bin/dash, ho provato echo ${$#}. Sorprendentemente questo non ha provocato un errore, ma in PID che è lo stesso dei $$contenuti variabili. Domanda, perché la sintassi ha funzionato? Qual è la regola di sintassi applicata dalla shell qui?

Fondamentalmente, quello che ho fatto è

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

Apparentemente, %anche il personaggio viene ignorato in tale costrutto

$ echo ${$%}
13819

Ma *e @causare l'errore di sostituzione Bad:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution

3
Cosa ti aspetti ${$*}e ${$@}produci?
Kusalananda

2
@Kusalananda Nessuna aspettativa. Stavo cercando altri personaggi accanto #e %e quali risultati di comportamento da quelli.
Sergiy Kolodyazhnyy il

1
Per eseguire effettivamente il collegamento indiretto in Dash, utilizzare evalad es dash -c 'set 1 2 3 4 5; eval "echo \$$#"'. Fonte: Ubuntu Wiki
wjandrea,

1
@wjandrea Sì, già a conoscenza di quello. In realtà c'è già una domanda al riguardo: stackoverflow.com/questions/1853946/… Stavo cercando di trovare un metodo da solo senza leggere prima la domanda (e sapevo già for i; do true; donedi inserire l'ultimo oggetto $i) ma stavo cercando qualcosa di più elegante. evalovviamente possono avere potenziali problemi, pensato fino a che punto - questo è un altro argomento. Ma sì, è un'opzione
Sergiy Kolodyazhnyy il

Risposte:


35

Questo è $$ con un prefisso vuoto rimosso :

${parameter#[word]}

Rimuovi modello prefisso più piccolo . La parola deve essere espansa per produrre uno schema. L'espansione del parametro deve quindi comportare il parametro , con la parte più piccola del prefisso abbinata al modello cancellato. Se presente, la parola non deve iniziare con un non citato #.

Lo stesso vale per %(suffisso). @e *non sono modificatori di espansione dei parametri, quindi sono errori. Succederebbe per $?, $-o anche per un ipotetico $=. ${$+}è un'espansione vuota.


Avrei dovuto riconoscere subito la sostituzione dei parametri. Buona pesca.
Sergiy Kolodyazhnyy il
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.