Come funzionano $ {0 ## * /} e $ {0% / *}?


33

Sono abbastanza confuso riguardo alle seguenti espressioni regolari che ho trovato in uno script di shell:

${0##*/}
${0%/*}

Come funzionano?

Risposte:


38

Quelle non sono espressioni regolari, sono esempi di espansione dei parametri di Bash: la sostituzione di una variabile o di un parametro speciale con il suo valore. Wooledge Wiki ha una buona spiegazione .

Fondamentalmente, nell'esempio che hai, si ${0##*/}traduce in:

per la variabile $ 0 e il modello '/', i due hash significano da dall'inizio del parametro, eliminano la corrispondenza più lunga (o avida), fino al modello incluso.

Quindi, dov'è $0il nome di un file, ad es.,$HOME/documents/doc.txt , Quindi il parametro verrà espanso come:doc.txt

Allo stesso modo, per ${0%/*}, il modello /è abbinato alla fine del parametro (il %), con la corrispondenza più breve o non avida eliminata - che nell'esempio sopra ti darebbe$HOME/documents .

Vedi anche l'articolo sul Wiki di Bash Hacker .


2
Quindi ... non volevano usare basenamee dirname? : D
Aaron D. Marasco,

8
Un vantaggio è che la sostituzione dei parametri non genera un sottoprocesso ...
jasonwryan,

@ Jasonwryan, puoi elaborare la funzionalità di * nei due esempi precedenti? O perché dobbiamo mettere * lì. In particolare, nel primo esempio, * è posto prima di //; mentre nel secondo esempio, * è posizionato dopo /. Qual è la differenza di fondo? Grazie.
user785099

3
Il glob ( *) indica che tutto fino al modello incluso verrà eliminato. Quindi, per l'inizio del parametro, #è a sinistra e alla fine %, lavorando dall'altra parte da destra.
Jasonwryan,

5
Non è specifico per bash, è specificato da POSIX sh.
nyuszika7h,
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.