for循环中的shell变量值在循环后不同

for循环中的shell变量值在循环后不同

我遇到了一个挑战,变量值在 for 循环中更改,并且在 for 循环之后使用 tee 更改该变量的值

SCRIPT_1:

    STATUS=9
    for  SESSION in  A B C
    do
       STATUS=5
       echo "SESSION=$SESSION  STATUS=$STATUS"
    done 
    echo "STATUS=$STATUS"

输出 script_1 是:

    SESSION=A  STATUS=5
    SESSION=B  STATUS=5
    SESSION=C  STATUS=5
    STATUS=5

SRIPT_2:

    STATUS=9
    for  SESSION in  A B C
    do
       STATUS=5
       echo "SESSION=$SESSION  STATUS=$STATUS"
    done | tee /tmp/ses.txt
    echo "STATUS=$STATUS"

输出_2 是:

    SESSION=A  STATUS=5
    SESSION=B  STATUS=5
    SESSION=C  STATUS=5
    STATUS=9

为什么在完成命令后使用 tee 时会有不同的输出。

答案1

当您放置“| tee”时,解释脚本的 shell 正在为循环分叉一个新的 shell。在循环中插入睡眠并在后台启动脚本会给出以下进程列表:

   PID TTY       TIME COMMAND
 21168 pts/0     0:00 sh
 21259 pts/0     0:00 ps
 11962 pts/0     0:00 sh
 21170 pts/0     0:00 sleep
 21171 pts/0     0:00 tee
 21169 pts/0     0:00 sh

正如您所看到的,列表末尾有一个额外的 shell。您可以使用此脚本获得相同的结果:

STATUS=9
echo "" > /tmp/ses.txt
for  SESSION in  A B C
do
   STATUS=5
   echo "SESSION=$SESSION  STATUS=$STATUS" | tee -a /tmp/ses.txt
done
echo "STATUS=$STATUS"

但没有你提到的副作用。

相关内容