是否应该尽可能避免在 bash 脚本中使用“exit”?

是否应该尽可能避免在 bash 脚本中使用“exit”?

有人告诉我,在 php 中最好尽可能避免使用 exit 命令。

对于 bash 来说也是一样吗?

例如以下

#!/bin/bash
if [ -z $1 ]; then
        echo You need to enter the directory you want to backup
else
        sourceFile=$1
        targetFile=/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)
        tar cvf $targetFile $sourceFile
fi

更喜欢这个吗?

#!/bin/bash
if [ -z $1 ]; then
        echo You need to enter the directory you want to backup
        exit
fi
        sourceFile=$1
        targetFile=/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)
        tar cvf $targetFile $sourceFile

答案1

引用'代码完成

当 [exit] 可以增强可读性时使用 在某些例程中,一旦您知道答案,就希望立即 [exit] 到调用例程。如果例程的定义方式是一旦检测到错误就不需要进一步清理,那么不立即 [exit] 意味着您必须编写更多代码。

因此,通常最好只有一个退出点(查看您的代码的人不必找到正确的退出语句),但是通过错误检查(尤其是在程序/例程开始时有多个退出语句会更清晰)。

您的例子有些边缘,但我想说第二种方法是更可取的,这样对程序/脚本的维护就可以保持整洁。

您的程序当前是(以伪代码形式)

if error condition 1
    // Show error message 1
else
    // Do stuff
fi

或者

if error condition 1
    // Show error message 1
    // exit
fi

// Do stuff

一旦你的程序发展壮大,你就会意识到程序可能失败的更多方式。你的程序现在变成

if error condition 1
    // Show error message 1
else 
    if error condition 2
         // Show error message 2
    else
         if error condition 3
             // Show error message 3
         else
             // Do stuff
         fi
    fi
fi

或者可能

if error condition 1
    // Show error message 1
else if error condition 2
    // Show error message 2
else if error condition 3
    // Show error message 3
else
    // Do stuff
fi

相对

if error condition 1
    // Show error message 1
    // exit
else if error condition 2
    // Show error message 2
    // exit
else if error condition 3
    // Show error message 3
    // exit
fi

// Do stuff

在我看来,最后一个最清楚,因为它能够区分哪些是错误情况,哪些是程序的主要流程。现在添加返回不同的值(例如,成功时返回 0,错误 1 ​​时返回 1,错误 2 时返回 2,等等),差异将变得更加明显。

答案2

我想这在某种程度上取决于你的代码的脚本以及你想要完成的任务、陷阱、错误处理等等。

一般来说,你要么想要指定退出状态

exit 1

或 set -e

#!/bin/bash -e

您可以通过多种方式添加错误管理

command 1 || echo "command 1 failed"

编写函数来捕获陷阱。

有一些不错的(介绍性)讨论,可供参考:

答案3

我的偏好是这样的:

#!/bin/bash
if [[ -z "$1" ]]; then
        # Notice that I added quotes and redirection
        echo "You need to enter the directory you want to backup" 1>&2
        exit
fi
# Notice that I fixed the indentation
sourceFile="$1"
targetFile="/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)"
tar cvf "$targetFile" "$sourceFile"

我认为在程序显然无法继续或程序明确完成时退出可以得到最干净的代码。

另外,要小心 Bash 中未加引号的字符串。它们迟早会给你带来麻烦。除非你特别想要不加引号的行为,否则始终用双引号将字符串括起来是个好习惯(即使从技术上讲这是不必要的)。此外,只要你使用 bash,[[就比 好得多[

相关内容