Bash:在while循环后保留变量的值

时间:2015-12-04 22:05:57

标签: bash

我需要在while循环结束后保留​​TEMP_FLAG的值。

#!/bin/bash

TEMP_FLAG=false

# loop over git log and set variable
git log --pretty="%H|%s" --skip=1 |
    while read commit; do 

        # do stuff like parsing the commit...

        # set variable     
        TEMP_FLAG=true 
    done

echo "$TEMP_FLAG" # <--- evaluates to false :(

我知道我的问题是由git log引导到while循环引起的,这会产生一个子shell,它不会返回我更新的变量。

但是,有没有办法在不改变管道的情况下实现我的预期行为?

1 个答案:

答案 0 :(得分:1)

当您使用管道时,您将自动创建子壳,以便shell可以连接输入和输出。这意味着您无法修改父环境,因为您现在处于子进程中。

正如anubhava所说,你可以通过使用过程替换来重新构造循环以避免管道:

while read commit; do
    TEMP_FLAG=true
done < <( git log --pretty="%H|%s" --skip=1 )

printf "%s\n" "$TEMP_FLAG"