타임스탬프가 있는 디렉터리를 압축하여 동일한 서버의 다른 위치로 이동하는 스크립트를 만들려고 했지만 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
기본 프로그램이므로 사용하기 위해 변수에 넣을 필요가 없습니다. 위 명령은/volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basename
유효한 파일 이름이 아닌 zipfile을 설정합니다. 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
. 그건 그렇고, 공백이 포함된 파일 이름을 만들지 말 것을 강력히 제안합니다. 나중에 감사하게 될 것입니다.