bash的while循环变量在循环外无效的问题

bash的while循环变量在循环外无效的问题

如下例子:

#!/bin/bash

typeset NUM=0

cat 1.txt | while read FILE; do
    ((NUM=NUM+1))
    echo "NUM=${NUM}"
done
echo "Total NUM=${NUM}"

假设文件1.txt内容为:

$ cat 1.txt 
1111
2222
3333

运行结果:

NUM=1
NUM=2
NUM=3
Total NUM=0

变量NUM在循环体内累加,但是在循环结束的时候NUM的值丢了,也就是说循环结果没有保留下来。为什么呢,因为while循环在一个新的shell进程里面运行的,循环内的NUM和外面的NUM不是一个变量。

解决办法:

#!/bin/bash

typeset NUM=0
while read FILE; do
    ((NUM=NUM+1))
    echo "NUM=${NUM}"
done < 1.txt
echo "Total NUM=${NUM}"

运行结果:

NUM=1
NUM=2
NUM=3
Total NUM=3

如果是命令输出的格式:

#!/bin/bash

# way 1: invalid
typeset NUM=0
ls *.sh | while read FILE; do
    ((NUM=NUM+1))
    echo "NUM=${NUM}"
done
echo "Total NUM=${NUM}"

# way 2: valid
typeset NUM=0
while read FILE; do
    ((NUM=NUM+1))
    echo "NUM=${NUM}"
done < <(ls *.sh)
echo "Total NUM=${NUM}"

运行结果:

NUM=1
NUM=2
Total NUM=0
NUM=1
NUM=2
Total NUM=2

可见后面一种才是我们想要的结果。

你可能感兴趣的:(bash的while循环变量在循环外无效的问题)