while循环遇到不懂的地方了~

while循环遇到不懂的地方了~

小弟,现在在看shell while循环,遇到几个不懂之处,想向大家请教。 实在不好意思啊~  

--------(1)
declare -i i
declare -i s
while [ "$i" != "101" ]
do
    s=s+i         #这里搞不懂了。
    i=i+1         #而且这两行中 i  又没有给它赋初值。还请高手详细告知是怎么回事,我很菜。谢谢!
                    #而且,后面的这个 i=i+1 怎么看好像也觉得是放在 s=s+i 的上面吧。 头晕了。。
done
echo "$s"
-------------


-------(2)
x=0
while [ $x -lt 10 ]
do
   echo $x
           x=`echo "$x+1" | bc`     #这里又搞不懂了。其中的 管道命令 bc ,有什么作用啊? 看不明白。
                                            但这里不写  | bc 又不行。 我知道bc是计算器,但不知道在这里表示啥?
done

---------

----------(3)
x=0
while [ $x -lt 10 ]
do
   y="$x"
   while [ "$y" -ge 0 ]
do
    echo "$y \c"
    y=`echo "$y -1" | bc`
    done
    echo
    x=`echo "$x+1" | bc`
done

----------   这个(3) 是完全看不懂,不知道是啥意思。希望各位高手帮帮我~ 谢谢了~      
echo 1+2
echo 1+2|bc
你执行一下这两个命令就知道了。
bash下计算还有一种方法:echo $((1+2))不过还是用bc比较通用,比如说
echo 3/2|bc和echo 3/2|bc -l|sed 's/0\+//'      
先看看什么效果
引用:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0] ; cat 1.sh

declare -i i
declare -i s
while [ "$i" != "101" ]
do
    s=s+i
    i=i+1
done
echo "$s"
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0] ; bash 1.sh
5050
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0] ; cat 2.sh

x=0
while [ $x -lt 10 ]
do
    echo $x
    x=`echo "$x + 1" | bc`
done
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0] ; bash 2.sh
0
1
2
3
4
5
6
7
8
9
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0] ; cat 3.sh

x=0
while [ $x -lt 10 ]
do
    y="$x"
    while [ "$y" -ge 0 ]
    do
        echo -n "$y"
        y=`echo "$y - 1" | bc`
    done
    echo
    x=`echo "$x + 1" | bc`
done
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0] ; bash 3.sh
0
10
210
3210
43210
543210
6543210
76543210
876543210
9876543210
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0] ; bye
      
哈 从来没用过declare
$((   )) 这种简单直接


建议楼主, 不明白的命令就一条条拆开来运行看效果
这些东西并没有从高深      
引用:
原帖由 li-jiahuan 于 2008-5-13 12:59 发表
哈 从来没用过declare
$((   )) 这种简单直接


建议楼主, 不明白的命令就一条条拆开来运行看效果
这些东西并没有从高深
$(())只支持整数运算,$((9/5))=1。      
walkerxk兄弟,说的很对。 $(())只支持整数运算,$((9/5))=1。

但兄弟前面讲的 echo 3/2|bc -l|sed 's/0\+//'  这句,我还是没能理解,还请解释一下。我运行了好像是小数。

而我自己是这样实现的  echo 'scale=4; 3/2' | bc   这样我自己可以自由定义小数点后面的位数。 但我不知道兄弟的是怎么定义的。 还希望介绍一下。  呵呵~

------------------
现在第二个问题解决了。  还希望大家帮忙一起把第一个和第三个问题解决啊~  第一个主要是不清楚,它们的顺序,以及根本就没有赋初值的问题。

第三个是完全不懂~  


      
echo 3/2|bc -l的结果是1.50000000000000000000
sed 's/0\+//'的作用是吧多余的0去掉
0+是一个或者N个0的意思,还有一种表示方法是00*,*是零个或者N个。
s/0\+//就是吧后面的0都去掉。所以就是1.5了。
scale=4是bc里面的语句,定义四位小数,你可以在终端输入bc回车进入bc的交互模式,然后再输入scale=4回车,3/2回车,就知道了,CTRL+D或者quit退出bc的交互模式
while [ "$i" != "101" ]
do
    s=s+i         #
    i=i+1         #没有赋初值,上面定义了是整型数字,所以默认初值是0。
                    #这个程序的意思是从0加到100,如果i=i+1放s=s+i前面,就变成了1加到101了。你执行一下看看结果就行了。
done
echo "$s"
至于第三个,外面的循环就是输出十行,,里面的循环的意思是从y开始输出一直到0,y就是每行的数字个数,
x=0
while [ $x -lt 10 ]
do
   y="$x"                        #定义每行的数字数目
   while [ "$y" -ge 0 ]               
do
    echo "$y \c"                #\c估计是不输出回车符,但是bash是用echo -n "$y"来替代了。
    y=`echo "$y -1" | bc`        #``是里面语句的执行结果,你可以试试$(echo ls)和ls,建议使用$()来替代,因为``很多时候和''区分不开
    done                       
    echo                        #输出回车符
    x=`echo "$x+1" | bc`
done      
呵呵~  谢谢兄弟了。 非常感谢~