如何返回到源 bash 脚本?

我在 bash 脚本中使用“ source”,如下所示:

#!/bin/bash
source someneatscriptthatendsprematurely.sh

我想退出 someneatscriptthatendsprematurely.sh 剧本,而不退出主要剧本。

感谢你们的帮助!

29527 次浏览

你需要 return声明:

return [n]

使函数退出,返回值由 n指定。如果省略 n,返回状态是函数体中执行的最后一个命令的状态。如果在函数之外使用,但是在 .(source)命令执行脚本期间,它会导致 shell 停止执行该脚本,并返回 n或脚本内执行的最后一个命令的退出状态作为脚本的退出状态。如果在函数之外而不是在 .执行脚本期间使用,则返回状态为 false。任何与 RETURN 陷阱相关联的命令都是在函数或脚本执行后恢复执行之前执行的。

您可以通过以下两个脚本看到这种情况:

script1.sh:
. script2.sh
echo hello again


script2.sh:
echo hello
return
echo goodbye

当你运行 script1.sh时,你会看到:

hello
hello again

改变环境变量重要吗?因为否则你只能通过执行没有源代码的脚本来执行它:

someneatscriptthatendsprematurely.sh

我刚才也有同样的问题

例如,我意识到添加一个检查器函数并返回不会返回其调用者的函数。

在 bash _ function 上

function install_packer_linux() {
check_wget && check_unzip
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
unzip packer_1.1.2_linux_amd64.zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_amd64.zip
}




function check_unzip() {
if ! [ -x "$(command -v unzip)" ]; then
echo "Error: unzip is not installed"
return 1
else
return 0
fi
}


function check_wget() {
if ! [ -x "$(command -v wget)" ]; then
echo "Error!: wget is not installed"
return 1
else
return 0
fi
}




$ source ~/.bash_functions

这里发生的情况是,由于检查器是它返回的惟一位置,因此 install _ packer _ linux 仍将继续

所以你可以在这里做两件事。要么保持当前格式(函数调用另一个函数)不变,使用 true 值进行计算,如果值不是 true,则返回; 要么在主 installer _ packer _ linux 函数上重写检查程序

真相:

function install_packer_linux() {
check_wget && check_unzip || return
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
unzip packer_1.1.2_linux_amd64.zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_amd64.zip
}

注意,我们在检查之后添加了 | | return,并使用 & & 将检查连接起来 所以如果不是两个检查都是真的,我们返回函数