如何将VAR从子脚本传递到父脚本的运行循环

时间:2019-03-26 15:02:43

标签: bash shell loops variables

我正在考虑如何在以下示例中解决此功能:

#!/bin/bash

. script.sh &

while [ "$VAR" != "OK" ];
do
    echo -e "Waiting..."
    sleep 1
done

script.sh

#!/bin/bash
export VAR=OK

while循环在其父外壳的子外壳中运行时,它将永远不会完成,也永远不会得到源script.sh export VAR=OK

有什么想法如何将VAR值传递给while循环吗?

注意:我需要在后台运行script.sh

谢谢!

5 个答案:

答案 0 :(得分:0)

孩子

#!/bin/bash
sleep 2                   # wait 2 seconds
echo "OK"

父母

#!/bin/bash
answer=$(mktemp)          # create a tempfile
./script.sh & >$answer    # start script in background, output in tempfile
wait $!                   # wait for script.sh finished
var=$(cat $answer)        # read anwser in variable 
echo $var                 # echo anwser
rm $answer                # cleanup - remove tempfile

答案 1 :(得分:0)

这应该做您想要的:

孩子:

sleep 1
echo blah >> $varfile

父母:

#make sure varfile exists and is empty..
echo > varfile

#run script in background
./script.sh &

# wait for some output:
VAR=$( ( tail -f varfile & )  | sed "/.*$/q")
echo >> varfile;

这里只说明一些技巧:

tail -f用于捕获输出。当它到达文件末尾时,该调用不会终止,而是坐下来等待更多内容写入文件(这是您想要的……起初……)。当它收到完整的一行时,将输出它,然后等待下一行。诀窍是它在正常情况下不会终止。相反,它将继续运行,直到有人执行ctrl-c或检测到管道损坏为止。必须将其推送为后台任务,否则脚本中的命令将永远不会终止。它的输出通过管道传递到sed中。另一方面,sed将在收到有效的输入结束时终止(由于该模式中的$),并且在收到输入结束时,脚本将继续执行。但是请注意,task此时仍在运行,并且将继续运行,直到它尝试将某些内容推入已损坏的管道中为止。为了防止它无限期运行,我们在sed终止后向它输出一些东西,这时它意识到管道已断开并终止。

答案 2 :(得分:0)

Unix / Linux系统对进程间通信提供了极大的支持。在这种情况下,我认为您正在寻找信号。例如,您可以执行以下操作:

{
       "op": "add",
       "path": "/fields/System.AssignedTo",
       "value": "McClure, Brandon"
}

如果在过程退出之前完成循环很重要,则可以trap发出该信号,并在收到该信号时设置foo & FOO_PID=$! # do other stuff kill $FOO_PID

答案 3 :(得分:0)

您可以使用Substitution流程来实现

#!/bin/bash

VAR=$(. script.sh &)

while [ "$VAR" != "OK" ];
do
    echo -e "Waiting..."
    sleep 1
done

script.sh

$VAR=OK
echo $VAR

答案 4 :(得分:-1)

parent.sh

#!/bin/bash

while :
do
   if [ -e /tmp/var_file ]; then
      VAR=$(cat /tmp/var_file)
      echo "VAR is $VAR"
      rm -f /tmp/var_file
   fi
   sleep 1
done

child.sh

#!/bin/bash

echo "SUCCESS" > /tmp/var_file