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
trwidzi argumenty -di [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
trwidzi argumenty -doraz nazwę pliku. Dzieje się tak na serwerze i wywoływany jest odpowiedni plik, oponieważ widzimy, że trusunął 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
trwidzi trzy lub więcej argumentów: -di nazwy plików. Ponieważ troczekuje 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 trto 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 trjest 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 trdział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 trpotrzebujesz 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 .
trzakresy są zapisywane bez otaczania[...]. Więctr -d '[a-z]'zabijea-z, a także postacie[i]. Służytr -d a-zdo zabijania tylko litera-z.