在shell脚本中将变量从一个脚本传递到另一个脚本

时间:2017-06-06 16:55:03

标签: unix

我有一个脚本假设是script.sh 它有两个脚本在

中运行parallaly
sh script1.sh &
sh script2.sh &
wait;
echo $var1
echo $var2

我想在运行script.sh

时打印这两个变量(var1,var2)
cat script1.sh

var1=1;
export $var1

cat script2.sh

var1=1;
export $var1

2 个答案:

答案 0 :(得分:1)

如果您的script1script2将其变量写入stdout,则可以使用bash 4.x中的协处理来完成此操作:

#!/usr/bin/env bash
#              ^^^- Must be bash, not /bin/sh; must NOT start this script with "sh name".

start_seconds=$SECONDS
run_script1() { sleep 5; echo "one"; }  # replace these with your script1 or script2
run_script2() { sleep 5; echo "two"; }

coproc coproc_script1 { run_script1; }
coproc coproc_script2 { run_script2; }

read -u "${coproc_script1[0]}" var1
read -u "${coproc_script2[0]}" var2
echo "End time: $(( SECONDS - start_seconds )); var1=$var1; var2=$var2"

如果值未并行运行,则End time将为10或更多。相反,它实际上应该是56上面的代码。

答案 1 :(得分:0)

想到的事情:

  1. 如果您使用bash,则可以使用dot:

    运行脚本
      

    .script1.sh

    它将在同一环境中运行脚本,因此您可以修改" invoker"的环境变量。脚本。

  2. 如果是单个输出数据,您只需打印到内部脚本的标准输出并在外部脚本中截取:

      

    inner_result =`script1.sh`

  3. 如果它是一个数值,你可以将它作为脚本的退出代码返回(但我不推荐这种方法,因为它在脚本开发中是一种不好的做法)

  4. 编辑:

    1. 使用临时文件存储结果然后将其删除(但根据操作系统,命名队列可能是最佳专用解决方案)