shell - 将子脚本中声明的变量调用到父 shell 脚本

标签 shell variables global

在我的例子中,脚本 A 正在调用脚本 B。

现在我在子脚本 B 中声明一个变量,并希望在前脚本中执行 if else 条件检查。

子脚本中的变量名

logFileName=stop_log$current_date'.log'

这就是我尝试调用的方式

logFileName = os.environ["logFileName"]  
export logfilename
echo $logFileName

然后进行条件检查,例如

if
logerr=`grep 'ConnectException' $logFileName`
if [ -z "$logerr" ]; then
echo " No error "
else
exit 1
fi

我无法在父脚本中导出该变量。有人可以帮忙吗?

最佳答案

出于所有实际目的,子进程无法在父进程中设置变量。

因此,您可以使用几个选项来将日志文件名从子级获取到父级:

  1. 使用 . 命令(在 C shell 和 Bash 中也称为 source)读取脚本 B 并将其作为当前 shell 的一部分执行。

  2. 让脚本 B 回显日志文件的名称。脚本 A 可以使用以下方式捕获它:

    logfilename=$(script-b …)
    

    这样做的主要缺点是,如果脚本 B 也应该生成其他输出,则很难做到。

  3. 让脚本 B 将日志文件的名称保存在另一个文件中。通常,脚本 A 应该告诉脚本 B 将其保存在哪里。有时,您可以就某个位置达成一致,但请记住,可能会同时运行脚本的多个副本,因此固定名称(例如 /tmp/tmp.file)对于多次计数(安全性和并发性都是问题)。

说明选项 3

脚本-A

logfilename=$(mktemp ${TMPDIR:-/tmp}/Script-A.log.XXXXXX

trap "rm -f $logfilename; exit 1" 0 1 2 3 13 15

echo "Message from Script-A" > $logfilename

Script-B $logfilename

echo "End message from Script-A" >> $logfilename

echo Log file name: $logfilename
cat $logfilename

rm -f $logfilename
trap 0

脚本-B

logfilename=${1:?}

echo "Script-B busy at work"
echo "Message for the log file" >> $logfilename  # NB: >> each time

echo "Script-B wrapping up"
echo "Script-B complete" >> $logfilename

Script-A代码中,命令mktemp根据给定的模板随机创建一个临时文件名。通常,模板为 /tmp/script-A.log.XXXXXX,其中 6 个 X 将替换为随机字母或数字。 trap 命令意味着如果脚本收到信号(SIGHUP 1、SIGINT 2、SIGQUIT 3、SIGPIPE 13 或 SIGTERM 15)或退出 (0),临时文件将被删除。如果它的生命周期比 Script-A 的运行时间长,您可以忽略陷阱但回显名称。它将一条消息写入日志文件;它运行 Script-B,传递日志文件名;它写了另一条消息。然后它结束:报告文件名,显示其内容;删除文件;并取消陷阱,使其能够以状态 0(成功)退出。

Script-B 代码检查是否已给定参数 (${1:?}) 并将其保存为变量 logfilename >。您可以让 Script-A 导出变量,并且 Script-B 可以测试环境变量是否已设置,而不需要参数,但参数通常更好。然后,Script-B 将一条消息回显到其输出,并将另一条消息回显到日志文件(请注意,您需要附加到日志文件)。它完成它的工作(这里什么也没有);将另一条消息写入输出,并将另一条消息写入日志文件;并退出。

您可以在 Script-B 中使用许多其他特技来将消息写入日志文件,但这应该可以帮助您继续。

如果您没有 mktemp 命令,请获取其源代码(GNU 或 BSD),或使用:

logfilename=${TMPDIR:-/tmp}/Script-A.log.$$

这使用进程 ID 为您提供适度的保证,即该名称不会被其他进程使用,但它更容易确定,因此比 mktemp 生成的随机名称安全性较低.

关于shell - 将子脚本中声明的变量调用到父 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22679490/

相关文章:

java - 如何在 shellbolt 中调用元组上的脚本

linux - 如何编写 bash 脚本将多个文件合并为一个文件

c - c中的全局变量

javascript - jquery ajax input[name=somename] val(data) - 如何识别多个变量

javascript - JS/Reactjs - 访问从顶级函数传递的参数

javascript - 为什么局部作用域不引用全局变量?

python - 如何使用 shell 脚本/C/Python 在文件每一行的末尾添加迭代文本?

python - 执行 shell 命令并在 Python 中检索标准输出

存储在 MySQL 中的 PHP 变量没有被解析

java - 如何使用对象作为类的变量,如ArrayList?