是否希望尽可能避免在 bash 脚本中使用“退出”?

use*_*637 4 gnome command-line bash gnome-terminal

我在 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
Run Code Online (Sandbox Code Playgroud)

更喜欢这个?

#!/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
Run Code Online (Sandbox Code Playgroud)

Por*_*jim 6

引用“代码完成

在提高可读性时使用[exit] 在某些例程中,一旦知道答案,就想立即[退出] 到调用例程。如果例程的定义方式使得它在检测到错误后不需要任何进一步的清理,那么不立即 [退出] 意味着您必须编写更多代码。

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

您的示例处于临界状态,但是我会说第二个是首选,以便对您的程序/脚本的维护可以使其保持整洁。

您的程序当前是(在伪代码中)

if error condition 1
    // Show error message 1
else
    // Do stuff
fi
Run Code Online (Sandbox Code Playgroud)

或者

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

// Do stuff
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

或者可能

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
Run Code Online (Sandbox Code Playgroud)

相对

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
Run Code Online (Sandbox Code Playgroud)

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