我已经制作了一个简单的备份脚本
代码:
function backups_remove_file
{
echo ""
echo "2. Make Backups Of Files(s)"
echo ""
echo "Which File You Wanna To Make Backups?"
read back
echo "What's The File's Name Should Be After Backups? And Where?"
read after
read -p "Continue (y/n)?" CONT1
if [ "$CONT1" == "y" ]; then
tar -cvpzf "$after.tar.gz" "$back"
echo "Backups File Successful !" ;
else
echo "Backups File Unsuccessful !" ;
fi
}
但有一个小问题我无法解决。当它显示
Which File You Want To Make Backups?
如果你在那之后写上“测试”,那么对于下一个问题
What's The File's Name Should Be After Backups? And Where?
例如如果你写了“test1”,那么如果他们想继续或者不输入的话就会出现安全问题,y
它会输出:
taking: test: can not state: No such file or directory
tar: Exiting with failure status due to previous errors
Backups File Successful!
在这种情况下,输出应该是Backups File Unsuccessful!
。在这种情况下,我应该怎么做才能获得预期的输出?
答案1
我认为更好的脚本会读取命令行输入--类似于:
#/bin/bash
echo "Shall back up $1 as $2 - press Ctrl-C to exit if this is not what you want"
sleep 3
echo "Backing Up..."
tar -cvpzf $2.tar.gz $1
echo "Backing up of $1 Complete"
notify-send -t 8000 "Backing up of $1 complete"
exit
然后您可以输入如下命令:
COMMAND "/path/to/input" "/path/to/output"
它notify-send
还会发送图形通知,因此完成后会通知您。
这只是我的建议 - 我会马上看看你的建议……
你的脚本的问题是这样的。它会说成功,as $CONT1
= y
,所以它会执行备份tar...
命令,然后回显Success
。只有当你输入 continue 参数而不是 as 时,它才会回显不成功y
。所以对于这个特定的脚本,更好的结尾应该是(这只会改变echo
终端输出中的内容):
if [ "$CONT1" == "y" ]; then
tar -cvpzf "$after.tar.gz" "$back"
echo "Backing up File finished!" ;
else
echo "Did not backup" ;
fi
exit
这似乎有效:
#!/bin/bash
echo ""
echo "Which File you want to backup?";
read input
echo "Where do you you want it to be backed up? (include .tar.gz extension)";
read output
read -p "Continue (y/n)? " CONT
if [ "$CONT" == "y" ]; then
tar -cpf "$input" "$output" || 'echo "Backing Up Failed" && exit;'
echo "Backing Up Successful!"
else
echo "Did not backup" ;
fi
exit
命令后面||
的 表示只有当命令出错时才会执行'echo "Backing Up Failed" && exit;'
,这将导致命令输出失败信息并退出。如果命令没有出错,它将忽略错误信息,输出成功信息并退出。
这可能会对某些文件的路径造成问题,因此您可能需要使用我建议的其他脚本......
希望这可以帮助。
答案2
我正在你的脚本中添加另一个if
条件。它将按你的意愿工作。请参阅下面修改后的脚本。
/bin/bash #!/bin/bash 函数 backups_remove_file() { echo“备份文件” echo“您想备份哪个文件?” 回过头再读 echo “备份后文件的名称应该是什么?在哪里?” 阅读后 读 -p“继续(y/n)?”CONT1 如果 [ "$CONT1" == "y" ]; 那么 tar -cvpzf "$after.tar.gz" "$back" 如果 [ $? == 0 ]; 那么 echo “备份文件成功!” 别的 echo “备份文件不成功!” 出口 1 菲 别的 echo “备份文件不成功!” 菲 } 备份删除文件
$?
存储 shell 上最后一个命令的退出状态。如果成功,则0
答案3
这有效:
function backups_remove_file
{
echo ""
echo "2. Make Backups Of Files(s)"
echo ""
echo "Which File You Wanna To Make Backups?"
read back
echo "What's The File's Name Should Be After Backups? And Where?"
read after
read -p "Continue (y/n)?" CONT1
if [ "$CONT1" == "y" ]; then
if tar -cvpzf "$after.tar.gz" "$back"; then
echo "Backups File Successful !"
else
echo "Backups File Unuccessful !"
fi
else
echo "User selected no"
fi
}
原因是tar ...
无论退出代码如何,后面的行都会运行。这意味着它总是会回显“成功”。如果出现问题,Bash 不会自动引发异常/错误。
这是通过tar ...
在if
语句中使用来修复的,因此它的退出代码会影响它从if
语句中采用哪条路径。