基本上这是我试图回答的问题
2) 编写一个 shell 脚本 (fridaybackup.sh),如果在星期五运行,它将备份 user2 主目录中的所有文件。该脚本将创建一个名为 user2backup.tar 的备份 (tar) 文件和一个名为 user2backup.zip 的 zip 文件
这就是我到目前为止所拥有的
#!/bin/sh
echo
echo "Do you want to create a full backup (Y=Yes, N=No) : \c"
read INPUT
day=$(date +%A)
time=$(date +%m-%d-%y)
filename=user2backup${time}.tar.gz
srcdir='/export/home/student/user2'
desdir='/export/home/student/backupfolder'
case $INPUT in
N) echo "Bye." ;;
Y)
if [ "$day" = "Monday" ]
then
tar -cpzf $desdir/$filename $srcdir
else
echo "A full backup is done on Fridays only!!!"
fi ;;
*) echo "Error" ;;
esac
但我得到这个结果
student@solaris:~/user2$ sh fridaybackup.sh
Do you want to create a full backup (Y=Yes, N=No) : Y
tar: /export/home/student/backupfolder/user2backup10-02-17.tar.gz: No
such file or directory
student@solaris:~/user2$ gedit fridaybackup.sh
任何帮助都会很棒,提前致谢
答案1
似乎存在复制/粘贴问题,
变量必须使用设置
day=$(date +%A)
我相信您使用反引号,它在格式化时消失,如“星期一”错误所示。
附近有语法错误if
星期一错误:未找到
证明设置是正确的,如第 14 行 bash遭遇:
( Monday = friday )
这分叉了一个子 shell,Monday
作为程序名称和= Friday
参数运行。这不是你想要的。
在外壳测试中使用完成
if [ "$day" = "Friday" ]
或者
if test "$day" = "Friday"
因此正确的 shell 看起来像:
#!/bin/sh
echo
echo "Do you want to create a full backup (Y=Yes, N=No) : \c"
read INPUT
day=$(date +%A)
time=$(date +%m-%d-%y)
filename=user2backup$time.tar.gz
srcdir='/export/home/student/user2'
desdir='/export/home/student/backupfolder'
case $INPUT in
N) echo "Bye." ;;
Y)
if [ "$day" = "Friday" ]
then
tar -cpzf $desdir/$filename $srcdir
else
echo "A full backup is done on Fridays only!!!"
fi ;;
*) echo "Error" ;;
esac
答案2
尝试使用read -p "Do you want to create a full backup (Y=Yes, N=No) : " INPUT
而不是你的:
echo "Do you want to create a full backup (Y=Yes, N=No) : \c"
read INPUT
编辑:正如评论中的@Raman所解释的那样,您在声明变量时犯了错误。
这将是声明filename
变量的最佳且最安全的方法:
filename="user2backup${time}.tar.gz"
答案3
该描述不需要询问用户。它可以自动完成:
#!/bin/sh
if [ $(date +%A) = Friday ]; then
TARFILE=/export/home/student/backupfolder/user2backup$(date +%m-%d-%y).tar
tar -cpf $TARFILE /export/home/student/user2
zip $TARFILE.zip $TARFILE
fi