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\+//' 先看看什么效果 :)
[quote][font=Courier][color=black][/color][color=blue]-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0][/color] [color=red]; cat 1.sh
[/color][color=black]
declare -i i
declare -i s
while [ "$i" != "101" ]
do
s=s+i
i=i+1
done
echo "$s"
[/color][color=blue]-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0][/color] [color=red]; bash 1.sh
[/color][color=black]5050
[/color][color=blue]-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0][/color] [color=red]; cat 2.sh
[/color][color=black]
x=0
while [ $x -lt 10 ]
do
echo $x
x=`echo "$x + 1" | bc`
done
[/color][color=blue]-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0][/color] [color=red]; bash 2.sh
[/color][color=black]0
1
2
3
4
5
6
7
8
9
[/color][color=blue]-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0][/color] [color=red]; cat 3.sh
[/color][color=black]
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
[/color][color=blue]-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0][/color] [color=red]; bash 3.sh
[/color][color=black]0
10
210
3210
43210
543210
6543210
76543210
876543210
9876543210
[/color][color=blue]-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[$$=4272 $?=0][/color] [color=red]; bye
[/color][color=black][/color][/font][/quote] 哈 从来没用过declare
$(( )) 这种简单直接
建议楼主, 不明白的命令就一条条拆开来运行看效果
这些东西并没有从高深 [quote]原帖由 [i]li-jiahuan[/i] 于 2008-5-13 12:59 发表 [url=http://www.linuxeden.com/forum/redirect.php?goto=findpost&pid=609963&ptid=163476][img]http://www.linuxeden.com/forum/images/common/back.gif[/img][/url]
哈 从来没用过declare
$(( )) 这种简单直接
建议楼主, 不明白的命令就一条条拆开来运行看效果
这些东西并没有从高深 [/quote]
$(())只支持整数运算,$((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 呵呵~ 谢谢兄弟了。 非常感谢~ :handshake
页:
[1]