Я хочу присвоить результат выражения переменной и объединить его со строкой, а затем повторить его. Вот что у меня есть:
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Но это выводит:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Итак, похоже, что это не присваивается $thefile
, а печатается по мере выполнения.
Ответы:
Назначение оболочки - это одно слово без пробела после знака равенства. Итак, то, что вы написали, присваивает пустое значение
thefile
; кроме того, поскольку назначение группируется с помощью команды, оно делаетthefile
переменную среды, и назначение является локальным для этой конкретной команды, то есть только вызовls
видит назначенное значение.Вы хотите захватить вывод команды, поэтому вам нужно использовать подстановку команд :
(Некоторые литературные источники показывают альтернативный синтаксис
thefile=`ls …`
; синтаксис обратных кавычек эквивалентен синтаксису долларовых скобок, за исключением того, что цитирование внутри обратных кавычек иногда бывает странным, поэтому просто используйте$(…)
.)Другие замечания о вашем сценарии:
-t
(сортировать по времени) с-U
(не сортировать) не имеет смысла; просто используйте-t
.Вместо того, чтобы использовать
grep
для сопоставления скриншотов, яснее передать подстановочный знакls
и использоватьhead
для захвата первого файла:Обычно плохая идея разбирать вывод
ls
. Это может плохо работать, если у вас есть имена файлов с непечатными символами. Однако сортировка файлов по дате затруднительнаls
, поэтому это приемлемое решение, если вы знаете, что в именах файлов не будет непечатаемых символов или обратной косой черты.Всегда используйте двойные кавычки вокруг подстановок переменных , т.е. здесь пишите
Без двойных кавычек значение переменной будет расширено, что вызовет проблемы, если оно содержит пробелы или другие специальные символы.
set -e
. Это говорит оболочке о выходе, если какая-либо команда завершается неудачно (возвращая ненулевой статус).Если у вас есть GNU find (в частности, если вы используете не встроенный Linux или Cygwin), есть другой подход к поиску самого последнего файла:
find
список файлов и их даты, а также использованиеsort
иtail
извлечение самого младшего файла.Если вы хотите написать этот скрипт на zsh вместо bash, есть гораздо более простой способ перехватить новейший файл, потому что zsh имеет квалификаторы glob, которые позволяют использовать подстановочные знаки не только для имен, но и для метаданных файла.
(om[1])
Часть после того, как шаблон отборочные GLOB;om
сортирует совпадения по возрасту (т. е. по времени изменения, сначала[1]
самое новое) и извлекает только первое совпадение. Все совпадения должны быть в скобках, потому что технически это массив, поскольку глобализация возвращает список файлов, даже если это[1]
означает, что в данном конкретном случае список содержит (максимум) один файл.источник
Если вы хотите сделать это с помощью нескольких строк / нескольких команд / с, то вы можете сделать это:
Или же:
Пример:
Выход:
источник
output=$(echo $someVariable)