Призначення оболонки - це одне слово, не маючи місця після знака рівності. Отже, те, що ви написали, присвоює порожнє значення thefile
; крім того, оскільки призначення групується з командою, воно робить thefile
змінну середовища, і призначення є локальним для цієї конкретної команди, тобто лише виклик, щоб ls
побачити призначене значення.
Ви хочете зафіксувати результат команди, тому вам потрібно використовувати заміну команди :
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(Деяка література показує альтернативний синтаксис thefile=`ls …`
; синтаксис зворотного котирування еквівалентний синтаксису дужок з дужками, за винятком того, що цитування всередині зворотних цитат іноді дивно, тому просто використовуйте $(…)
.)
Інші зауваження щодо вашого сценарію:
- Поєднувати
-t
(сортувати за часом) з -U
(не сортувати) не має сенсу; просто використовувати -t
.
Замість того, щоб використовувати grep
зіставлення скріншотів, чіткіше передавати підстановку ls
та використовувати head
для зйомки першого файлу:
thefile=$(ls -t *"Screen Shot"* | head -n 1)
Як правило, погана ідея розбору результатівls
. Це може вийти з ладу, якщо у вас є імена файлів з недрукуваними символами. Однак, сортування файлів за датою важко ls
, тому це прийнятне рішення, якщо ви знаєте, що у імен файлів не буде друкованих символів чи зворотних косих рисок.
Завжди використовуйте подвійні лапки навколо змінних підстановок , тобто тут пишіть
echo "Most recent screenshot is: $thefile"
Без подвійних лапок значення змінної повторно розширюється, що спричинить проблеми, якщо вона містить пробіли чи інші спеціальні символи.
- Вам не потрібні крапки з комою в кінці рядка. Вони зайві, але нешкідливі.
- У сценарій оболонки часто корисно включити
set -e
. Це повідомляє оболонці вийти, якщо будь-яка команда не виконана (шляхом повернення ненульового стану).
Якщо у вас є GNU find (зокрема, якщо ви не працюєте з вбудованим Linux або Cygwin), є ще один підхід до пошуку останнього файлу: складіть find
список файлів та їх дати, а також використовуйте sort
та tail
витягайте наймолодший файл.
thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
sort -k 1n | tail -n 1)
Якщо ви готові написати цей скрипт в zsh замість bash, існує набагато простіший спосіб знайти найновіший файл, оскільки zsh має глобальні класифікатори, які дозволяють підкреслити відповідність не лише на імена, але і на метадані файлів. (om[1])
Частина після того, як шаблон відбіркові GLOB; om
сортує відповідність за збільшенням віку (тобто за часом модифікації, найновішим першим) та [1]
витягує лише перший збіг. Весь збіг повинен бути в дужках, оскільки це технічно масив, оскільки глобул повертає список файлів, навіть якщо [1]
означає, що в цьому конкретному випадку список містить (максимум) один файл.
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"