Przypisanie powłoki jest pojedynczym słowem, bez spacji po znaku równości. Więc to, co napisałeś, przypisuje pustą wartość thefile
; ponadto, ponieważ przypisanie jest zgrupowane z poleceniem, powoduje to, że thefile
zmienna środowiskowa jest zmienna, a przypisanie jest lokalne dla tego konkretnego polecenia, tj. tylko wywołanie, aby zobaczyć ls
przypisaną wartość.
Chcesz uchwycić dane wyjściowe polecenia, więc musisz użyć podstawienia polecenia :
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(Część literatury pokazuje alternatywną składnię thefile=`ls …`
; składnia tylnego cytatu jest równoważna składni nawiasów dolara, z wyjątkiem tego, że czasami cytowanie w cudzysłowach jest dziwne, więc po prostu użyj $(…)
).
Inne uwagi na temat skryptu:
- Łączenie
-t
(sortuj według czasu) z -U
(nie sortuj) nie ma sensu; po prostu użyj -t
.
Zamiast grep
dopasowywać zrzuty ekranu, łatwiej jest przekazać symbol wieloznaczny ls
i użyć head
do przechwycenia pierwszego pliku:
thefile=$(ls -t *"Screen Shot"* | head -n 1)
Zasadniczo analizowanie danych wyjściowychls
jest złym pomysłem . Może to zawieść dość źle, jeśli masz nazwy plików ze znakami niedrukowalnymi. Sortowanie plików według daty jest jednak trudne bez ls
, więc jest to akceptowalne rozwiązanie, jeśli wiesz, że w nazwach plików nie będzie znaków, które nie mogą zostać wydrukowane, ani ukośników odwrotnych.
Zawsze używaj podwójnych cudzysłowów wokół podstawień zmiennych , tj. Pisz tutaj
echo "Most recent screenshot is: $thefile"
Bez podwójnych cudzysłowów wartość zmiennej jest ponownie interpretowana, co spowoduje problemy, jeśli będzie zawierała spacje lub inne znaki specjalne.
- Nie potrzebujesz średników na końcu linii. Są zbędne, ale nieszkodliwe.
- W skrypcie powłoki często warto uwzględnić
set -e
. Mówi to powłoce, aby zakończyła działanie, jeśli jakiekolwiek polecenie zawiedzie (przez zwrócenie niezerowego statusu).
Jeśli masz GNU find (w szczególności jeśli korzystasz z niewbudowanego systemu Linux lub Cygwin), istnieje inne podejście do znajdowania najnowszego pliku: wyświetl find
listę plików i ich daty oraz użyj sort
i tail
wypakuj najmłodszy plik.
thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
sort -k 1n | tail -n 1)
Jeśli chcesz napisać ten skrypt w zsh zamiast bash, istnieje znacznie łatwiejszy sposób na złapanie najnowszego pliku, ponieważ zsh ma kwalifikatory glob, które pozwalają na dopasowanie symboli wieloznacznych nie tylko nazw, ale także metadanych plików. (om[1])
Część po wzór kwalifikatory glob; om
sortuje mecze według wieku (tj. według czasu modyfikacji, najnowsze jako pierwsze) i [1]
wyodrębnia tylko pierwsze dopasowanie. Całe dopasowanie musi być w nawiasach, ponieważ technicznie jest to tablica, ponieważ globbing zwraca listę plików, nawet jeśli [1]
oznacza to, że w tym konkretnym przypadku lista zawiera (najwyżej) jeden plik.
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"