Выполните команду и поместите результаты в переменную ... все в сценарии bash

787
CamelBlues

Я работаю над сценарием bash, который создает резервную копию файла конфигурации перед копированием в новый файл.

Вот как выглядит мой фрагмент:

mv ~/myStuff.conf ~/myStuff.conf.bak cp ~/new/myStuff.conf ~/myStuff.conf 

Каждый раз, когда запускается этот скрипт, я бы хотел, чтобы в резервной копии была метка времени unix в имени файла. Я пробовал это

DATEVAR=date +%s mv ~/myStuff.conf ~/myStuff.conf.$DATEVAR.bak 

Но это не работает, так как функция date не выполняется, и bash видит ее как строку, а полученный файл

myStuff.conf.date+%s.bak 

Любые идеи о том, как получить результаты функции даты в переменную?

1
Технически, тот другой является дубликатом этого, поскольку это на 3 года старше. music2myear 7 лет назад 0

3 ответа на вопрос

5
Rich Homolka

Это возможно с подстановкой команд .

DATEVAR=$(date +%s) 
1
Klaas-Z4us-V
--[[z4us|binz--]] export datevar=`date` # date embedded in backquotes --[[z4us|binz--]] echo $datevar Lun 25 Gen 2016 15:56:14 CET 
Помимо правильного форматирования кода, объяснение того, что происходит, улучшило бы этот ответ. Nattgew 8 лет назад 0
Ну, Nattgew FYI: `export` делает переменную доступной в среде для использования в следующих шагах. Обратные кавычки окружают команду bash, которая будет выполнена. Я думал, что суперпользователи должны знать эти основы, но, конечно, мы должны думать о читателях, которые приходят сюда через любую поисковую систему :-) Klaas-Z4us-V 8 лет назад 0
Для `bash` вы можете прочитать любую оболочку, и я использовал команду без параметров, чтобы увидеть, что по умолчанию. Klaas-Z4us-V 8 лет назад 0
1
Daniel Liston

Это не отвечает переменной, содержащей выходные данные команды. Это уже ответил. Что касается остальной части вашего примера скрипта;

Немного более короткая версия:

mv ~/myStuff.conf ~/myStuff.conf.$(date +%s) 

Нет необходимости устанавливать переменную для чего-то, что вам нужно или используется только один раз. Кроме того, чтобы быть совместимым с большим количеством оболочек, вы также можете использовать этот синтаксис:

mv ~/myStuff.conf ~/myStuff.conf.`date +%s` 

Мне просто кажется, что использование метки даты в качестве расширения устраняет необходимость в дополнительном .bak в имени файла.