在shell中,管道里边改变量是无效的。 
脚本一:
#!/bin/bash
number=0
cat file | while read line;do
    echo $line
   ((number+=1))
   echo "number1=$number"                         //循环内输出number值
done
echo "number2=$number"                          //循环外取得number值
 
输出结果
number1=9
number2=0
 
可以用另一种方法
脚本二:
#!/bin/bash
number=0
while read line;do
echo $line
((number+=1))
echo "number1=$number"
done < file
echo "number2=$number"
 
输出结果
number1=9
number2=9
 
这次number赋值在循环外就生效了。
 
脚本练习
#!/bin/bash
cd /home/sum/maillist/sendmail
mailfile=`date +%Y%m%d%H`
export s=0
export f=0
export sum=0
for filename in *
do
  if [ ! -s $filename ]
    then
      echo "delete $filename" >> /home/sum/shell/sendmail.log
      rm -rf $filename
  else
    tmpfile=`cat /home/sum/shell/email_temp.html`
    while read line
     do
        str1=`echo $line |awk -F "#" '{print $2}'`
        str2=`echo $line |awk -F "#" '{print $3}'`
        str3=`echo $line |awk -F "#" '{print $4}'`
        str4=`echo $line |awk -F "#" '{print $5}'`
        mailuser=`echo $line|awk -F "#" '{print $6}'`
        tmp=`echo $tmpfile|sed -e "s/#1#/${str1}/g"`
        tmp=`echo $tmp | sed -e "s/#2#/${str2}/g"`
        tmp=`echo $tmp | sed -e "s/#3#/${str3}/g"`
        tmp=`echo $tmp | sed -e "s/#4#/${str4}/g"`
        echo $mailuser >> /home/sum/shell/sendmail.log
        /usr/local/bin/sendEmail -f xxx@126.com -t "$mailuser" -s maiil.126.com -u "回答您的提问" -xu xxx@126.com -xp 111111 -m "$tmp"  -o message-charset=GB2312 >> /home/sum/shell/sendmail.log
        num=`echo $?`
          if [ $num -eq 0 ];then
            ((s=s+1))
          else
            ((f=f+1))
            echo "mail false user:$mailuser" >> /home/sum/shell/sendmail_false.log
          fi
        ((sum=sum+1))
        sleep 5s
     done < $filename
  rm -rf /home/sum/maillist/sendmail/$mailfile
 fi
done
echo "sucess mail:$s"
echo "false mail:$f"
echo "total send mail:$sum"