Co się dzieje
Powłoka (bash) widzi argument [a-z]
. Jest to wzór wieloznaczny ( glob ), który pasuje do każdej małej litery¹. Dlatego powłoka szuka nazwy pliku pasującej do tego wzorca. Istnieją trzy przypadki:
- Żaden plik w bieżącym katalogu nie ma nazwy, która jest pojedynczą małą literą. Następnie powłoka pozostawia wzór wieloznaczny bez zmian i
tr
widzi argumenty -d
i [a-z]
. Tak dzieje się na większości twoich maszyn.
- Pojedynczy plik w bieżącym katalogu ma nazwę, która jest pojedynczą małą literą. Następnie powłoka rozwija wzorzec do tej nazwy pliku i
tr
widzi argumenty -d
oraz nazwę pliku. Dzieje się tak na serwerze i wywoływany jest odpowiedni plik, o
ponieważ widzimy, że tr
usunął list o
.
- Dwa lub więcej plików w bieżącym katalogu ma nazwę składającą się z jednej małej litery. Następnie powłoka rozwija wzorzec do listy pasujących nazw plików i
tr
widzi trzy lub więcej argumentów: -d
i nazwy plików. Ponieważ tr
oczekuje później jednego argumentu -d
, będzie narzekać.
Co powinieneś był zrobić
Jeśli w argumencie polecenia są znaki specjalne, musisz je uciec. Umieść argument w pojedynczych cudzysłowach '…'
(jest to najprostszy sposób, istnieją inne). Wewnątrz pojedynczych cudzysłowów wszystkie postacie są sobą, z wyjątkiem samego pojedynczego cudzysłowu. Jeśli wewnątrz argumentu znajduje się pojedynczy cytat, zamień go na'\''
.
tr -d '[a-z]'
Pamiętaj jednak, że prawdopodobnie nie to miałeś na myśli! Mówi tr
to o usuwaniu małych liter i nawiasów kwadratowych. To odpowiednik tr -d ']a-z['
, tr '[]a-z'
itp Aby usunąć małe litery, stosowanie
tr -d a-z
Argumentem tr
jest zestaw znaków. Umieszczasz nawiasy wokół zestawu znaków w wyrażeniu regularnym lub wzorze wieloznacznym, aby wskazać, że jest to zestaw znaków. Ale tr
działa na jedną postać na raz. Argumenty wiersza poleceń są tym, co należy umieścić w nawiasach .
Potrzebujesz nawiasów, aby wskazać klasy znaków . W wyrażeniu regularnym używasz nawiasów wewnątrz nawiasów, aby wskazać klasę znaków, np. [[:lower:]]*
Pasuje do dowolnej liczby małych liter, [[:lower:]_]*
pasuje do dowolnej liczby małych liter i podkreśleń. Jako argument tr
potrzebujesz zestawu bez otaczających go nawiasów, więc tr -d '[:lower:]'
usuwa małe litery, tr -d '[:lower:]_'
usuwa małe litery i podkreślenia itp.
¹ W niektórych lokalizacjach może pasować do innych znaków .
tr
zakresy są zapisywane bez otaczania[...]
. Więctr -d '[a-z]'
zabijea-z
, a także postacie[
i]
. Służytr -d a-z
do zabijania tylko litera-z
.