Назначение оболочки - это одно слово без пробела после знака равенства. Итак, то, что вы написали, присваивает пустое значение 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 имеет квалификаторы glob, которые позволяют использовать подстановочные знаки не только для имен, но и для метаданных файла. (om[1])
Часть после того, как шаблон отборочные GLOB; om
сортирует совпадения по возрасту (т. е. по времени изменения, сначала [1]
самое новое) и извлекает только первое совпадение. Все совпадения должны быть в скобках, потому что технически это массив, поскольку глобализация возвращает список файлов, даже если это [1]
означает, что в данном конкретном случае список содержит (максимум) один файл.
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"