Che cosa sta succedendo
La shell (bash) vede l'argomento [a-z]
. Questo è un modello jolly (un glob ), che corrisponde a qualsiasi lettera minuscola¹. Pertanto la shell cerca un nome file che corrisponda a questo modello. Esistono tre casi:
- Nessun file nella directory corrente ha un nome che è una singola lettera minuscola. Quindi la shell lascia invariato il modello jolly e
tr
vede gli argomenti -d
e [a-z]
. Questo è ciò che accade sulla maggior parte delle tue macchine.
- Un singolo file nella directory corrente ha un nome che è una singola lettera minuscola. Quindi la shell espande il modello con questo nome di file e
tr
vede gli argomenti -d
e il nome del file. Questo accade sul server e viene chiamato il file corrispondente o
poiché possiamo vedere che ha tr
eliminato la lettera o
.
- Due o più file nella directory corrente hanno un nome che è una singola lettera minuscola. Quindi la shell espande il modello all'elenco dei nomi file corrispondenti e
tr
vede tre o più argomenti: -d
e i nomi file. Poiché si tr
aspetta un solo argomento dopo -d
, si lamenterà.
Cosa avresti dovuto fare
Se nell'argomento di un comando sono presenti caratteri speciali, è necessario evitarli. Inserisci l'argomento tra virgolette singole '…'
(questo è il modo più semplice, ce ne sono altri). All'interno delle virgolette singole, tutti i personaggi si distinguono da soli tranne la virgoletta singola stessa. Se nell'argomento è presente una virgoletta singola, sostituirla con'\''
.
tr -d '[a-z]'
Tuttavia nota che probabilmente non è ancora quello che volevi dire! Questo dice tr
di cancellare lettere minuscole e parentesi quadre. È equivalente a tr -d ']a-z['
, tr '[]a-z'
ecc. Per eliminare lettere minuscole, utilizzare
tr -d a-z
L'argomento tr
è un set di caratteri. Metti le parentesi attorno a un set di caratteri in un'espressione regolare o in un jolly per indicare che si tratta di un set di caratteri. Ma tr
funziona su un singolo personaggio alla volta. I suoi argomenti della riga di comando sono quelli che inseriresti tra parentesi .
Sono necessarie parentesi per indicare le classi di caratteri . In un'espressione regolare, si usano parentesi tra parentesi per indicare una classe di caratteri, ad es. [[:lower:]]*
Corrisponde a qualsiasi numero di lettere minuscole, [[:lower:]_]*
corrisponde a qualsiasi numero di lettere minuscole e caratteri di sottolineatura. Nell'argomento di tr
, è necessario l'insieme senza le parentesi quadre circostanti, quindi tr -d '[:lower:]'
elimina le lettere minuscole, tr -d '[:lower:]_'
elimina lettere minuscole e caratteri di sottolineatura, ecc.
¹ In alcune versioni locali potrebbe corrispondere ad altri caratteri .
tr
intervalli sono scritti senza racchiudere[...]
. Cosìtr -d '[a-z]'
uccideràa-z
, e anche personaggi[
e]
. Usatr -d a-z
per uccidere solo letterea-z
.