Che tipo di operazione è / # / - in "$ {my_array [@] / # / -}"?


17

La risposta accettata per trasformare un array in argomenti di un comando? utilizza il seguente comando Bash:

command "${my_array[@]/#/-}" "$1"

Sto cercando di capire /#/-esattamente cosa fa la parte. Sfortunatamente, non so come chiamarlo, quindi ho problemi a trovare documentazione. Ho esaminato la sezione della pagina man di Bash su array e alcuni siti Web, ma non riesco a trovare nulla.

Risposte:


24

Questa è un'istanza di sostituzione del modello nell'espansione dei parametri della shell : si ${parameter/pattern/replacement}espande ${parameter}, sostituendo la prima istanza di patterncon replacement. Nel contesto di un modello di questo tipo, #è speciale: fissa il modello all'inizio del parametro. Il risultato finale di tutto ciò è espandere tutti i valori my_arraynell'array, anteponendo -a ciascuno di essi (sostituendo il modello vuoto all'inizio di ciascun parametro).


2

Sì, è una sostituzione del modello nell'espansione dei parametri della shell come:

${parameter/pattern/replacement}

Ma se il primo personaggio dopo il primo / è o /o #o %ha il significato speciale di all(ripetuto), starte end.

con:

$ str='one_#two_two_three_one'

Un singolo /sostituirà la prima istanza. La prima istanza di one:

$ echo "${str/one/x-x}"
x-x_#two_two_three_one

O la prima istanza di two:

$ echo "${str/two/x-x}"
one_#x-x_two_three_one

L'istanza di one alla fine:

$ echo "${str/%one/x-x}"
one_#two_two_three_x-x

Tutte le ripetizioni di two :

$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one

L'istanza di one all'inizio:

$ echo "${str/#one/x-x}"
x-x_#two_two_three_one

Una stringa che inizia con # (cita il #):

$ echo "${str/\#two/x-x}"
one_x-x_two_three_one

Ma se si lascia solo # (non quotato), la sostituzione viene impostata all'inizio della variabile:

$ echo "${str/#/====}"
====one_#two_two_three_one

Inoltre, se il parametro è un array, la sostituzione viene eseguita su tutti gli elementi:

$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three

La formulazione è un po 'fuorviante come #e %fanno parte del modello mentre //è un operatore diverso /e usa gli stessi schemi. Puoi avere pattern='#x'; echo "${var/$pattern}"(o ${var//$pattern}), ma pattern=/x; echo "${var/$pattern}"non è lo stesso di echo "${var//x}". Si noti che #e %possono essere combinati in zsh, ma non in bashentrambi ksh.
Stéphane Chazelas,
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.