我正在使用此脚本制作一个计数器,我想在内循环之外访问它,但我没有成功。我遗漏了什么?
while [ 1 ]
do
COUNTER=0
ls /tmp/paping* | grep -v pid | while read pap
do
ret=`cat $pap`
if [ "a$ret" == "aTimeout" ]
then
echo "Do something"
else
arr[$COUNTER]=$pap
COUNTER=$(( COUNTER + 1 ))
fi
sleep 0.3
echo $COUNTER
done
#THIS LINE RETURNs 0
echo $COUNTER
done
答案1
正如@steeldriver 指出的那样,当我通过管道创建子shell时,var 值不会传递给外部var。
就像这样关联提供
解决方案如下:
while [ 1 ]
do
COUNTER=0
while read pap
do
ret=`cat $pap`
if [ "a$ret" == "aTimeout" ]
then
echo "do something"
else
arr[$COUNTER]=$pap
COUNTER=$(( COUNTER + 1 ))
fi
sleep 0.3
echo $COUNTER
done < <( ls /tmp/paping* | grep -v pid)
echo $COUNTER
done
现在我的计数器已按预期工作!
答案2
假设您的 shell 是bash
,将命令放在shopt -s lastpipe
脚本的顶部是一种可能的解决方案。