Shell变量while循环内改变无法传递到循环外

  • shell中使用管道会生成一个子shell,在子shell中使用while、for循环的代码也是在子shell中执行的,所以在循环中的修改的变量只在子shell中有效,当循环结束时,会回到主shell,子shell中修改的变量不会影响主shell中的变量
    代码如下:
A="1"
B="2"
C="/home/linux/a"

cat $C | grep -v '^commit' | while read line
do
     if [ "x$A" = "x1" ]; then
         B=$A
         echo $B
     fi
done

echo $B

第一个echo打印的是1
第二个echo打印的是2

这里是因为在子shell中的while循环中的B只是主shell中B的一个副本,在子shell中对B重新赋值是不能影响到父shell的,所以最后echo $B时值没有改变。

以下是可以的:

while read line
do
   if
   B=$A
   fi
done < $C

这样是可以重新赋值的,因为这里没有管道,也就不存在子shell了

你可能感兴趣的:(linux基础)