sh/bash/dash/ksh/zsh等Shell脚本
-
yetone
- 帖子: 7
- 注册时间: 2011-01-27 20:30
#1
帖子
由 yetone » 2011-10-14 22:08
本人小白,这几天准备学习一下shell scripts,无意间弄了个C语言的绘圆程序,看似简单,随即想通过shell scripts来移植一下,顺便练练手,但是屡试屡败,望高手赐教,感激不尽
C程序源码:
代码: 全选
#include<stdio.h>
#include<math.h>
int main()
{
double y;
int x,m;
for(y=10;y>=-10;y--)
{
m=2.5*sqrt(100-y*y); /*计算行y对应的列坐标m,2.5是屏幕纵横比调节系数因为屏幕的
行距大于列距,不进行调节显示出来的将是椭圆*/
for(x=1;x<30-m;x++)
printf(" "); /*图形左侧空白控制*/
printf("*"); /*圆的左侧*/
for(;x<30+m;x++)
printf(" "); /*图形的空心部分控制*/
printf("*\n"); /*圆的右侧*/
}
return 0;
}
鄙人移植的shell scripts:
代码: 全选
#!/bin/bash
for ((y=10;y>=-10;y=y-1))
do
m=$(printf "%.f" $(echo "2.5*sqrt(100-$y*$y)"|bc))
for ((x=1;x<30-$m;x=x+1))
do
printf " "
done
printf "*"
for ((;x<30+$m;x=x+1))
do
printf " "
done
printf "*\n"
done
执行后出现:
代码: 全选
(standard_in) 1: parse error
代码: 全选
Linux,Freebsd,Solaris,Sco,HP-UX,IBM-AIX,cisco,oracle,java,cgi,mysql,perl,Apache,proFTP,Sendmail,Qmail,DNS,Squid,Rsync,SSL
-
lilydjwg
- 论坛版主
- 帖子: 4249
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
-
联系:
#2
帖子
由 lilydjwg » 2011-10-14 22:36
shell 不是用来做计算的。
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#3
帖子
由 fnan » 2011-10-15 7:50
#练习而已,一般计算也行。
m=$(printf "%.f" $(echo "2.5*sqrt(100-($y*$y))"|bc))
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
yetone
- 帖子: 7
- 注册时间: 2011-01-27 20:30
#4
帖子
由 yetone » 2011-10-15 10:32
fnan 写了:#练习而已,一般计算也行。
m=$(printf "%.f" $(echo "2.5*sqrt(100-($y*$y))"|bc))
Thanks,shell的确是诡异啊
代码: 全选
Linux,Freebsd,Solaris,Sco,HP-UX,IBM-AIX,cisco,oracle,java,cgi,mysql,perl,Apache,proFTP,Sendmail,Qmail,DNS,Squid,Rsync,SSL
-
yetone
- 帖子: 7
- 注册时间: 2011-01-27 20:30
#5
帖子
由 yetone » 2011-10-15 14:24
fnan 写了:#练习而已,一般计算也行。
m=$(printf "%.f" $(echo "2.5*sqrt(100-($y*$y))"|bc))
谢谢你,你可以帮我解释一下为什么要加括号吗?
代码: 全选
Linux,Freebsd,Solaris,Sco,HP-UX,IBM-AIX,cisco,oracle,java,cgi,mysql,perl,Apache,proFTP,Sendmail,Qmail,DNS,Squid,Rsync,SSL
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#6
帖子
由 eexpress » 2011-10-15 14:43
括号,就是获取结果。
等于一串命令的组合。可以用``代替。
shell作这事情,是傻。
● 鸣学
-
yetone
- 帖子: 7
- 注册时间: 2011-01-27 20:30
#7
帖子
由 yetone » 2011-10-15 14:46
eexpress 写了:括号,就是获取结果。
等于一串命令的组合。可以用``代替。
shell作这事情,是傻。
谢谢eexpress大人的指教,sheel的确不适合计算,只是拿来练练手,
嘿嘿
代码: 全选
Linux,Freebsd,Solaris,Sco,HP-UX,IBM-AIX,cisco,oracle,java,cgi,mysql,perl,Apache,proFTP,Sendmail,Qmail,DNS,Squid,Rsync,SSL
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#8
帖子
由 fnan » 2011-10-15 20:43
括号是提取结果,这里有个关键问题:
$(echo "2.5*sqrt(100-($y*$y))"|bc))
#100-$y*$y 并不是数学表达式,而是echo的参数,*只是普通字符,!无优先级别! 不加括号的话,echo如实变量扩展为:100--10*-10,传给bc就是格式错误,所以也可以这样:
$(echo "2.5*sqrt($((100-$y*$y)))"|bc))
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
ChenFengyuan
- 帖子: 770
- 注册时间: 2008-03-23 0:39
#9
帖子
由 ChenFengyuan » 2011-10-15 23:03
eexpress 写了:括号,就是获取结果。
等于一串命令的组合。可以用``代替。
shell作这事情,是傻。
同意,用lisp代替就好了。
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#10
帖子
由 fnan » 2011-10-17 19:07
真认为LZ想画圈圈?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。