修复交互式备份脚本中的条件

修复交互式备份脚本中的条件

我已经制作了一个简单的备份脚本

代码:

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语句中采用哪条路径。

相关内容