3

Я пытался создать сценарий, который сжимает каталог с отметкой времени и перемещает его в другое место на том же сервере, но я не могу отобразить 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 ответ1

5

У вас там разные проблемы.

  • Сначала вы хотите присвоить результат даты команды 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 которое не является допустимым именем файла. Если вы объясните, что вы пытаетесь сделать с базовым именем, я мог бы помочь, но это не имеет смысла.

  • Вы, кажется, думаете, что DIRS - это список, это не так, это всего лишь один каталог /volume1/NetBackup .

  • Другой момент - это вопрос стиля. Вы всегда должны избегать использования имен переменных CAPITAL, поскольку все переменные окружения являются заглавными, и это может привести к проблемам, если вы используете одно и то же имя.

В любом случае, если я понимаю, что вы пытаетесь сделать здесь, вы могли бы написать скрипт следующим образом (я сделал 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 . Кстати, я бы также настоятельно рекомендовал вам не создавать имена файлов с пробелами, вы будете мне благодарны позже.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .