Chcę przypisać wynik wyrażenia do zmiennej i połączyć go ciągiem znaków, a następnie wywołać echo. Oto co mam:
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Ale to daje:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Wygląda na to, że nie jest to przypisywane $thefile
i jest drukowane w trakcie wykonywania.
Odpowiedzi:
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, żethefile
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 :
(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:
-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 wieloznacznyls
i użyćhead
do przechwycenia pierwszego pliku:Zasadniczo analizowanie danych wyjściowych
ls
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 bezls
, 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
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.
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żyjsort
itail
wypakuj najmłodszy plik.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.źródło
Jeśli chcesz to zrobić za pomocą polecenia multiline / multiple / s, możesz to zrobić:
Lub:
Przykład:
Wynik:
źródło
output=$(echo $someVariable)