Chinaunix

标题: 一个shell写的加法机,请高手帮忙修改一下 [打印本页]

作者: xlink    时间: 2006-04-08 03:12
标题: 一个shell写的加法机,请高手帮忙修改一下
shell初学者,不要见笑。请高手帮忙修正一下:
已知问题:
1.不能屏蔽英文字符和符号的输入。
2.减法错误。

一共两个文件,addrobot和numf
addrobot内容:
#!/bin/sh
clear
cat /dev/null > num.txt
cat /dev/null > numf.txt
while [ TRUE ]
do
clear
line=`wc -l num.txt|awk '{ print $1 }'`
sum=`awk 'BEGIN { sum = 0 } { sum = sum + $1} END { OFMT = "%.2f"; print sum/100; }' num.txt`
tput cup 25 20
echo $line行                        总计:$sum
tput cup 1 8
echo  ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
echo -----------------------------------------------------xlink-----------------
for x in 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
do
tput cup $x 4
echo 数据录入:
tput cup $x 14
read num
if [ $num = q 2>/dev/null ]
then
exit
elif [ -z $num ]
then
tput cup $x 14
echo "非法数值"
elif [ $num -eq 0 2>/dev/null ]
then
tput cup $x 14
echo "非法数值"
else
tput cup $x 40
echo $num>tmp
echo $num>>num.txt
No=`wc -l num.txt|awk '{print $1}'`
echo No.$No
line=`wc -l num.txt|awk '{ print $1 }'`
sum=`awk 'BEGIN { sum = 0 } { sum = sum + $1} END { OFMT = "%.2f"; print sum/100; }' num.txt`
tput cup 25 20
echo 共$line行                        总计:$sum
tput cup $x 48
./numf
tput cup $x 14
fi
done
done

numf内容:
#!/bin/sh
n=`awk '{print length($1)}' tmp`
if [ $n = 1 ]
then read num<tmp
echo 0.0$num
echo 0.0$num>>numf.txt
elif [ $n = 2 ]
then read num<tmp
echo 0.$num
echo 0.$num>>numf.txt
elif [ $n = 3 ]
then read num<tmp
na=`echo $num|cut -c1`
nb=`echo $num|cut -c2-3`
echo ${na}.${nb}
echo ${na}.${nb}>>numf.txt
elif [ $n = 4 ]
then read num<tmp
na=`echo $num|cut -c1-2`
nb=`echo $num|cut -c3-4`
echo ${na}.${nb}
echo ${na}.${nb}>>numf.txt
elif [ $n = 5 ]
then read num<tmp
na=`echo $num|cut -c1-3`
nb=`echo $num|cut -c4-5`
echo ${na}.${nb}
echo ${na}.${nb}>>numf.txt
elif [ $n = 6 ]
then read num<tmp
na=`echo $num|cut -c1`
nb=`echo $num|cut -c2-4`
nc=`echo $num|cut -c5-6`
echo ${na},${nb}.${nc}
echo ${na},${nb}.${nc}>>numf.txt
elif [ $n = 7 ]
then read num<tmp
na=`echo $num|cut -c1-2`
nb=`echo $num|cut -c3-5`
nc=`echo $num|cut -c6-7`
echo ${na},${nb}.${nc}
echo ${na},${nb}.${nc}>>numf.txt
elif [ $n = 8 ]
then read num<tmp
na=`echo $num|cut -c1-3`
nb=`echo $num|cut -c4-6`
nc=`echo $num|cut -c7-8`
echo ${na},${nb}.${nc}
echo ${na},${nb}.${nc}>>numf.txt
elif [ $n = 9 ]
then read num<tmp
na=`echo $num|cut -c1`
nb=`echo $num|cut -c2-4`
nc=`echo $num|cut -c5-7`
nd=`echo $num|cut -c8-9`
echo ${na},${nb},${nc}.${nd}
echo ${na},${nb},${nc}.${nd}>>numf.txt
elif [ $n = 10 ]
then read num<tmp
na=`echo $num|cut -c1-2`
nb=`echo $num|cut -c3-5`
nc=`echo $num|cut -c6-8`
nd=`echo $num|cut -c9-10`
echo ${na},${nb},${nc}.${nd}
echo ${na},${nb},${nc}.${nd}>>numf.txt
elif [ $n = 11 ]
then read num<tmp
na=`echo $num|cut -c1-3`
nb=`echo $num|cut -c4-6`
nc=`echo $num|cut -c7-9`
nd=`echo $num|cut -c10-11`
echo ${na},${nb},${nc}.${nd}
echo ${na},${nb},${nc}.${nd}>>numf.txt
elif [ $n = 12 ]
then read num<tmp
na=`echo $num|cut -c1`
nb=`echo $num|cut -c2-4`
nc=`echo $num|cut -c5-7`
nd=`echo $num|cut -c8-10`
ne=`echo $num|cut -c11-12`
echo ${na},${nb},${nc},${nd}.${ne}
echo ${na},${nb},${nc},${nd}.${ne}>>numf.txt
elif [ $n = 13 ]
then read num<tmp
na=`echo $num|cut -c1-2`
nb=`echo $num|cut -c3-5`
nc=`echo $num|cut -c6-8`
nd=`echo $num|cut -c9-11`
ne=`echo $num|cut -c12-13`
echo ${na},${nb},${nc},${nd}.${ne}
echo ${na},${nb},${nc},${nd}.${ne}>>numf.txt
elif [ $n = 14 ]
then read num<tmp
na=`echo $num|cut -c1-3`
nb=`echo $num|cut -c4-6`
nc=`echo $num|cut -c7-9`
nd=`echo $num|cut -c10-12`
ne=`echo $num|cut -c13-14`
echo ${na},${nb},${nc},${nd}.${ne}
echo ${na},${nb}.${nc},${nd}.${ne}>>numf.txt
else
:
fi
作者: yjh777    时间: 2006-04-08 16:10
。。。太长不敢看,你实现的是什么功能呀? 算术表达式分析并计算吗
比如说在命令行 输入 5 + 6 * 7 - 15 * (5 - 3) 程序可以分析计算出结果。
作者: xlink    时间: 2006-04-08 19:02
  1. 。。。太长不敢看,你实现的是什么功能呀? 算术表达式分析并计算吗
  2. 比如说在命令行 输入 5 + 6 * 7 - 15 * (5 - 3) 程序可以分析计算出结果。
复制代码

不是,仅仅是个加法机。
有效的代码不超过5行,其余是格式化出输出的内容。
功能仅仅是:
输入123
输入123


计算结果:246
作者: 寂寞烈火    时间: 2006-04-09 00:59
原帖由 xlink 于 2006-4-8 19:02 发表
  1. 。。。太长不敢看,你实现的是什么功能呀? 算术表达式分析并计算吗
  2. 比如说在命令行 输入 5 + 6 * 7 - 15 * (5 - 3) 程序可以分析计算出结果。
复制代码

不是,仅仅是个加法机。
有效的代码不超过5行,其余 ...

  1. cat<<!|awk '{sum+=$1}END{print sum}'
  2. ...
  3. !
复制代码

作者: xlink    时间: 2006-04-09 02:00
寂寞烈火,没解决问题。

我用bc去解决计算问题,能说说怎么屏蔽英文字符和符号的输入么?
作者: 寂寞烈火    时间: 2006-04-09 11:34
原帖由 xlink 于 2006-4-9 02:00 发表
寂寞烈火,没解决问题。

我用bc去解决计算问题,能说说怎么屏蔽英文字符和符号的输入么?

用正则表达式来判断输入
作者: xlink    时间: 2006-04-09 11:39
原帖由 寂寞烈火 于 2006-4-9 11:34 发表

用正则表达式来判断输入

我也是这么想的,但是不知道怎么去实现。
能给一个最简单的例子么?
初学者,掌握知识不全面,想去过滤,但是不知道如何实现。
作者: dbcat    时间: 2006-04-09 15:34
天那!真是神奇
作者: xlink    时间: 2006-04-09 21:10
原帖由 dbcat 于 2006-4-9 15:34 发表
天那!真是神奇

何奇之有?
作者: 寂寞烈火    时间: 2006-04-09 22:59
原帖由 xlink 于 2006-4-9 11:39 发表

我也是这么想的,但是不知道怎么去实现。
能给一个最简单的例子么?
初学者,掌握知识不全面,想去过滤,但是不知道如何实现。

http://bbs.chinaunix.net/viewthr ... &extra=page%3D1
作者: 網中人    时间: 2006-04-10 02:29
try this:
  1. #!/bin/bash

  2. chkdigit() {
  3.         echo "$num" | grep -q '[^. 0-9]' && {
  4.                 echo non-digit found: "${num//[. 0-9]}"
  5.                 continue
  6.         }
  7. }

  8. chknum() {
  9.         [ $# = 2 ] || {
  10.                 echo we need 2 numbers, not $#.
  11.                 continue
  12.         }
  13. }

  14. chkdot() {
  15.         for i; do
  16.                 echo $i | grep -q '\..*\.' && {
  17.                         echo $i has too many dots
  18.                         continue 2
  19.                 }
  20.         done
  21. }

  22. while : ; do
  23.         read -p "Give me 2 numbers: " num
  24.         chkdigit
  25.         chknum $num
  26.         chkdot $num
  27.         break
  28. done

  29. echo -n "The sum of ${num/ /+} is: "
  30. echo "${num// /+}" | bc
复制代码

[ 本帖最后由 網中人 于 2006-4-10 03:25 编辑 ]
作者: xxjoyjn    时间: 2006-04-10 08:58
strongest
作者: xlink    时间: 2006-04-10 21:20
原帖由 網中人 于 2006-4-10 02:29 发表
try this:
[code]#!/bin/bash

chkdigit() {
        echo "$num" | grep -q '[^. 0-9]' && {
                echo non-digit found: "${num//[. 0-9]}"
                con ...

等我仔细看一下!
作者: xlink    时间: 2006-04-10 21:42
纲中人
我没读懂你的代码是什么意思。
如果是你写的代码,请加上注释,谢谢了!
作者: yunzhongyue    时间: 2006-04-11 10:00
原帖由 網中人 于 2006-4-10 02:29 发表
try this:
[code]#!/bin/bash

chkdigit() {
        echo "$num" | grep -q '[^. 0-9]' && {
                echo non-digit found: "${num//[. 0-9]}"
                con ...

不支持负数!
作者: 網中人    时间: 2006-04-11 15:54
原帖由 yunzhongyue 于 2006-4-11 10:00 发表

不支持负数!


fixed:
  1. #!/bin/bash

  2. chkdigit() {
  3.         echo "$num" | grep -Eq '[^. 0-9-]' && {
  4.                 echo non-digit found: "${num//[. 0-9]}"
  5.                 continue
  6.         }
  7. }

  8. chknum() {
  9.         [ $# = 2 ] || {
  10.                 echo we need 2 numbers, not $#.
  11.                 continue
  12.         }
  13. }

  14. chkfmt() {
  15.         for i; do
  16.                 echo $i | grep -q '\..*\.' && {
  17.                         echo $i has too many dots
  18.                         continue 2
  19.                 }
  20.                 echo ${i:1} | grep -q '-' && {
  21.                         echo - in $i is not at leading position.
  22.                         continue 2
  23.                 }
  24.                 [ "$i" = - ] && {
  25.                         echo $i contains no number.
  26.                         continue 2
  27.                 }
  28.         done
  29. }

  30. while : ; do
  31.         read -p "Give me 2 numbers: " num
  32.         chkdigit
  33.         chknum $num
  34.         chkfmt $num
  35.         break
  36. done

  37. echo -n "The sum of ${num/ / + } is: "
  38. echo "${num// / + }" | bc
复制代码


p.s.
至於註解, 等有空再補. 或其他人願意幫忙, 也行.
作者: waker    时间: 2006-04-11 16:05
printf "%f" "$num" &>/dev/null || echo "Bad format, input a number plz"

是不是就可以了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2