タイムスタンプ付きのディレクトリを圧縮し、同じサーバー上の別の場所に移動するスクリプトを作成しようとしていますが、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
。もう 1 つのポイントはスタイルの問題です。環境変数はすべて大文字なので、同じ名前を使用すると問題が発生する可能性があるため、大文字の変数名の使用は常に避けてください。
ともかく、もしここで何をしようとしているのかは理解しています。次のようにスクリプトを記述できます (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
。ちなみに、スペースを含むファイル名を作成しないように強くお勧めします。後で感謝することになるでしょう。