关于bash while循环里变量的作用域的问题
发表于 : 2012-11-30 17:57
听说bash里如果不用关键字local定义的变量都是全局变量,但是在下面的两段while循环里为何变量count及数组aTest, cTest的值都不能带回呢?比如count 在第一个循环里变成了5,而退出循环后却变成了0。而for循环里数组bTest和count的值是可以带回的:
count is 4
array nuber : 4
bTest [3] : 3
代码:
#!/bin/bash
declare -i count
count=0
ls | sort | while read perline
do
echo $perline
aTest[$count]=$perline
echo aTest [$count] : ${aTest[$count]}
count=$count+1
echo count : $count
echo array nuber : ${#aTest[*]}
done
echo
echo exit while
echo count is $count
echo array nuber : ${#aTest[*]}
echo aTest [3] : ${aTest[3]}
echo -----------------------------------------------------
count=0
for ((i=0;i<4;i++))
do
bTest[$count]=$i
echo bTest [$count] : ${bTest[$count]}
count=$count+1
echo count : $count
echo array nuber : ${#bTest[*]}
done
echo
echo exit for
echo count is $count
echo array nuber : ${#bTest[*]}
echo bTest [3] : ${bTest[3]}
echo -----------------------------------------------------
count=0
echo {0..3} | sed 's/ /\n/g' | (while read perline
do
echo $perline
cTest[$count]=$perline
echo cTest [$count] : ${cTest[$count]}
count=$count+1
echo count : $count
echo array nuber : ${#cTest[*]}
done
)
echo
echo exit while
echo count is $count
echo array nuber : ${#cTest[*]}
echo cTest [3] : ${cTest[3]}
运行结果:
tmp1
aTest [0] : tmp1
count : 1
array nuber : 1
tmp2
aTest [1] : tmp2
count : 2
array nuber : 2
tmp3
aTest [2] : tmp3
count : 3
array nuber : 3
tmp4
aTest [3] : tmp4
count : 4
array nuber : 4
tmp4.log
aTest [4] : tmp4.log
count : 5
array nuber : 5
exit while
count is 0
array nuber : 0
aTest [3] :
-----------------------------------------------------
bTest [0] : 0
count : 1
array nuber : 1
bTest [1] : 1
count : 2
array nuber : 2
bTest [2] : 2
count : 3
array nuber : 3
bTest [3] : 3
count : 4
array nuber : 4
exit for
count is 4
array nuber : 4
bTest [3] : 3
-----------------------------------------------------
0
cTest [0] : 0
count : 1
array nuber : 1
1
cTest [1] : 1
count : 2
array nuber : 2
2
cTest [2] : 2
count : 3
array nuber : 3
3
cTest [3] : 3
count : 4
array nuber : 4
exit while
count is 0
array nuber : 0
cTest [3] :
请问这是为什么?如何让while循环有for循环那样的效果?之所以用while,是觉得它从文件里读整行的数据进行处理比较方便
count is 4
array nuber : 4
bTest [3] : 3
代码:
#!/bin/bash
declare -i count
count=0
ls | sort | while read perline
do
echo $perline
aTest[$count]=$perline
echo aTest [$count] : ${aTest[$count]}
count=$count+1
echo count : $count
echo array nuber : ${#aTest[*]}
done
echo
echo exit while
echo count is $count
echo array nuber : ${#aTest[*]}
echo aTest [3] : ${aTest[3]}
echo -----------------------------------------------------
count=0
for ((i=0;i<4;i++))
do
bTest[$count]=$i
echo bTest [$count] : ${bTest[$count]}
count=$count+1
echo count : $count
echo array nuber : ${#bTest[*]}
done
echo
echo exit for
echo count is $count
echo array nuber : ${#bTest[*]}
echo bTest [3] : ${bTest[3]}
echo -----------------------------------------------------
count=0
echo {0..3} | sed 's/ /\n/g' | (while read perline
do
echo $perline
cTest[$count]=$perline
echo cTest [$count] : ${cTest[$count]}
count=$count+1
echo count : $count
echo array nuber : ${#cTest[*]}
done
)
echo
echo exit while
echo count is $count
echo array nuber : ${#cTest[*]}
echo cTest [3] : ${cTest[3]}
运行结果:
tmp1
aTest [0] : tmp1
count : 1
array nuber : 1
tmp2
aTest [1] : tmp2
count : 2
array nuber : 2
tmp3
aTest [2] : tmp3
count : 3
array nuber : 3
tmp4
aTest [3] : tmp4
count : 4
array nuber : 4
tmp4.log
aTest [4] : tmp4.log
count : 5
array nuber : 5
exit while
count is 0
array nuber : 0
aTest [3] :
-----------------------------------------------------
bTest [0] : 0
count : 1
array nuber : 1
bTest [1] : 1
count : 2
array nuber : 2
bTest [2] : 2
count : 3
array nuber : 3
bTest [3] : 3
count : 4
array nuber : 4
exit for
count is 4
array nuber : 4
bTest [3] : 3
-----------------------------------------------------
0
cTest [0] : 0
count : 1
array nuber : 1
1
cTest [1] : 1
count : 2
array nuber : 2
2
cTest [2] : 2
count : 3
array nuber : 3
3
cTest [3] : 3
count : 4
array nuber : 4
exit while
count is 0
array nuber : 0
cTest [3] :
请问这是为什么?如何让while循环有for循环那样的效果?之所以用while,是觉得它从文件里读整行的数据进行处理比较方便