Co jest nie tak z następującym kodem?
name='$filename | cut -f1 -d'.''
Tak jak jest, otrzymuję dosłowny ciąg $filename | cut -f1 -d'.'
, ale jeśli usunę cudzysłowy, nic nie otrzymam. Tymczasem piszę
"test.exe" | cut -f1 -d'.'
w powłoce daje mi wyjście chcę, test
. Wiem już, że $filename
została przypisana odpowiednia wartość. Chcę przypisać zmiennej nazwę pliku bez rozszerzenia.
basename $filename .exe
zrobiłby to samo. To przy założeniu, że zawsze wiesz, jakie rozszerzenie chcesz usunąć.basename "$filename" .exe
. W przeciwnym razie nazwy plików ze spacjami byłyby złą wiadomością.Odpowiedzi:
Powinieneś używać składni podstawiania poleceń,
$(command)
gdy chcesz wykonać polecenie w skrypcie / poleceniu.Więc twoja linia byłaby
Objaśnienie kodu:
echo
pobierz wartość zmiennej$filename
i wyślij ją na standardowe wyjściecut
poleceniacut
Użyje. jako separator (znany również jako separator) do cięcia ciągu na segmenty i przez-f
wybranie segmentu, który chcemy mieć na wyjściu$()
podstawienie polecenia spowoduje uzyskanie wyniku i zwrócenie jego wartościname
Zauważ, że to daje część zmiennej do pierwszego okresu
.
:źródło
echo $filename | cut -f1 -d'.'
$()
jest preferowane.Możesz także użyć rozszerzenia parametrów:
źródło
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
. Dzięki.image.png.gz
?%.*
usunie tylko ostatnie rozszerzenie; jeśli chcesz usunąć wszystkie rozszerzenia, użyj%%.*
.Jeśli znasz rozszerzenie, możesz użyć basename
źródło
.wiki
i skończyć z/home/jsmith/base
?Jeśli nazwa pliku zawiera kropkę (inną niż rozszerzenie), użyj tego:
źródło
-s
opcjącut
, która zwraca pusty ciąg, gdy nazwa pliku nie zawiera kropki.użyj tego, co chcesz. Tutaj zakładam, że ostatnia
.
(kropka), po której następuje tekst, to rozszerzenie.źródło
wyjścia:
Zwróć uwagę, że usuwane jest tylko ostatnie rozszerzenie.
źródło
Moja rekomendacja to użycie
basename
.Jest to domyślnie w Ubuntu, wizualnie prosty kod i radzi sobie z większością przypadków.
Oto kilka przypadków podrzędnych zajmujących się spacjami i rozszerzeniem wielopunktowym / podrzędnym:
Zwykle pozbywa się rozszerzenia od pierwszego
.
, ale zawodzi na naszej..
drodzeOto ważna uwaga:
Jednak nadal musisz o tym pomyśleć
.hidden_files
nie oczekiwany wynik. Aby tak się stało, użyj
$HOME
lub,/home/user_path/
ponieważ ponownie bash jest „nietypowy” i nie rozwijaj „~” (wyszukaj bash BashPitfalls)
źródło
wyjścia:
źródło
Jak zauważył Hawker65 w komentarzu do odpowiedzi Chepnera, najczęściej głosowane rozwiązanie nie obejmuje ani wielu rozszerzeń (takich jak nazwa_pliku.tar.gz), ani kropek w pozostałej części ścieżki (takiej jak ta ścieżka / z .dots / in.path.name). Możliwe rozwiązanie to:
źródło
Dwa problemy z Twoim kodem:
Zmieniłbym twój kod na "name =` echo $ filename | cut -f 1 -d '.' `", jak pokazano poniżej (ponownie zwróć uwagę na tylne znaczniki otaczające definicję zmiennej nazwy):
źródło