Mam problem z opanowaniem podstaw skryptów Bash. Oto co mam do tej pory:
#!/bin/bash
FILES="/home/john/my directory/*.txt"
for f in "${FILES}"
do
echo "${f}"
done
Chcę tylko wyświetlić listę wszystkich .txt
plików w for
pętli, dzięki czemu mogę robić z nimi różne rzeczy. Ale miejsce w my directory
gwiazdce i gwiazdka po *.txt
prostu nie grają ładnie. Próbowałem używać go z podwójnymi cudzysłowami i bez nich, z nawiasami klamrowymi i bez nich na nazwach zmiennych i nadal nie mogę wydrukować wszystkich .txt
plików.
To bardzo podstawowa rzecz, ale wciąż walczę, ponieważ jestem zmęczony i nie mogę myśleć prosto.
Co ja robię źle?
Udało mi się z powodzeniem zastosować powyższy skrypt, jeśli moje PLIKI nie mają spacji ani gwiazdki ... Musiałem eksperymentować z podwójnymi cudzysłowami i nawiasami klamrowymi lub bez nich, aby go uruchomić. Ale w momencie gdy mam zarówno spacje, jak i gwiazdkę, wszystko to psuje.
for f in "$DIR"/*.txt
= finefor f in "$DIR/*.txt"
= breaksPodczas gdy używanie tablic, jak pokazuje John1024, ma o wiele większy sens, tutaj możesz również użyć operatora split + glob (pozostawiając cudzysłowu zmienną niecytowaną).
Ponieważ chcesz tylko część globalną tego operatora, musisz wyłączyć część podzieloną :
źródło
Możesz pozostawić tylko znaki wieloznaczne poza cudzysłowami.
Coś w rodzaju:
w przypadku „plików ze spacjami” *.. Txt „
wykonaj
przetwarzanie
zakończone
Jeśli same symbole wieloznaczne rozwiną się do spacji, musisz użyć pliku dla linii, na przykład użyj ls -l, aby wygenerować listę pliki i użyj bash read, aby uzyskać każdy plik.
źródło
Kiedy chcesz przetwarzać na zestawie plików, bierzesz pod uwagę, że pod nazwą może znajdować się spacja lub inny kod scape, więc przed rozpoczęciem procesu, np.
for loop
Lubfind command
ustaw naIFS bash env variable
:źródło