Я пытаюсь создать скрипт, который сжимает каталог с меткой времени и перемещает его в другое место на том же сервере, но мне не удаётся отобразить TESTDATE в zip-файле, в результате чего имя файла становится .zip.
#!/bin/sh
# date
TESTDATE="date +%b-%d-%y"
# dirs to backups
DIRS="/volume1/NetBackup"
# Save zip file elsewhere on the server
DEST="/volume1/NetBackup/Backup"
# set to "no" keep old zip file and add new file
DELETE_OLD_ZIP_FILES="no"
#Path to binary files
BASENAME=/usr/bin/basename
ZIP=/usr/syno/bin/zip
for d in $DIRS
do
echo $DIRS
zipfile="${DEST}/$(${TESTDATE} ${d} ${BASENAME}).zip"
echo -n "Creating $zipfile..."
# create zip file
${ZIP} -r $zipfile $d &>/dev/null && echo "Done!"
done
решение1
У вас там разные проблемы.
Сначала вы хотите присвоить результат команды
date +%b-%d-%y
переменнойTESTDATE
. Для этого вам нужно использоватьзамена команды:TESTDATE=$(date +%b-%d-%y)
Ваш скрипт в данный момент присваивает строку
date +%b-%d-%y
,TESTDATE
а не результат команды. Вы можете проверить, запустив это:TESTDATE="date +%b-%d-%y" echo $TESTDATE
который будет печатать
date +%b-%d-%y
.Во-вторых, вы используете подстановку команд там, где не следует, а вам нужно:
zipfile="${DEST}/${TESTDATE} ${d} ${BASENAME}.zip"
Итак, вам не нужны скобки. Я также понятия не имею, что вы пытаетесь сделать с
basename
этим.basename
— это программа по умолчанию, и вам не нужно помещать ее в переменную, чтобы использовать ее. Команда выше устанавливает zipfile в/volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basename
то, что не является допустимым именем файла. Если вы объясните, что вы пытаетесь сделать с basename, я, возможно, смогу помочь, но в таком виде это не имеет смысла.Вы, кажется, думаете, что
DIRS
это список, но это не так, это просто один каталог/volume1/NetBackup
.Другой момент — вопрос стиля. Вам следует всегда избегать использования заглавных букв в именах переменных, поскольку переменные окружения полностью состоят из заглавных букв, и это может привести к проблемам, если вы используете то же имя.
В любом случае,еслиЯ понимаю, что вы пытаетесь здесь сделать, вы можете написать скрипт следующим образом (я превратил его dirs
в массив, так как думаю, что это то, что вы хотели):
#!/usr/bin/env bash
# date
testdate=$(date +%b-%d-%y)
# dirs to backup
dirs=("/volume1/NetBackup" "/volume1/foobar")
# Save zip file elsewhere on the server
dest="/volume1/NetBackup/Backup"
# set to "no" keep old zip file and add new file
delete_old_zip_files="no"
#Path to binary files
zip=/usr/syno/bin/zip
base=$(/usr/bin/basename ${dest})
echo "bb $base";
for d in ${dirs[@]}
do
## I assume this is what you wanted to do, it will just
## return the name of the current $d directory
base=$(/usr/bin/basename ${d})
zipfile="${dest}/${testdate} ${base}.zip"
echo -n "Creating $d $zipfile..."
# create zip file
${zip} -r $zipfile $d && echo "Done!" || echo ""
done
Пример скрипта выше создаст /volume1/NetBackup/Backup/Mar-05-14 NetBackup.zip
и /volume1/NetBackup/Backup/Mar-05-14 foobar.zip
. Кстати, я также настоятельно рекомендую вам избегать создания имен файлов с пробелами, позже вы скажете мне спасибо.