好吧,我知错了 ==两边也要用空格
#!/bin/bash
read -p "number1: " num1
read -p "number2: " num2
read -p "ope: " ope
if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
then
test1=$(echo $num1 |sed 's/[0-9]//g')
test2=$(echo $num2 |sed 's/[0-9]//g')
else
echo "enter number is null,try again"
exit 12
fi
if [ -z "$test1" -a -z "$test2" ]
then
echo "Please enter a valid value"
exit 10
fi
if [ "$ope"=='+' ]
then
sum=$(( $num1 + $num2 ))
elif [ "$ope"=='-' ]
then
sum=$(( $num1 - $num2 ))
elif [ "$ope"=='*' ]
then
sum=$(( $num1 * $num2 ))
elif [ "$ope"=='/' ]
then
sum=$(( $num1 / $num2 ))
else
echo "Please enter a valid symbol"
exit 11
fi
echo "$num1 $ope $num2 = $sum"
个人认为:read命令后面的变量,属于赋值,所以不需要$()。其它的调用变量的命令,需要$()。
这样看代码看不到你说的问题,你应该把报错也贴上的。
暂时看见有几个问题:
-n 与“num1” 中间要有空格。
== 两边要有空格
[ xxx ] 方括号里的判断要跟两个方括号之间有空格
除法那行不要带双引号
最后一行只要在两边加双引号就够了,不要写那么多双引号
可能还有漏看的。。。
下面是我写的拆解过if结构的
#!/bin/bash # 例子:计算器 read -t 30 -p "input num1:" num1 read -t 30 -p "input num2:" num2 read -t 30 -p "input ope(+-*/):" ope if [ -n "$num1" -a -n "$num2" -a -n "$ope" ] then test1=$(echo $num1 | sed 's/[0-9]//g') test2=$(echo $num2 | sed 's/[0-9]//g') if [ -z "$test1" -a -z "$test2" ] then echo "check ok " else echo "error input" exit 10 fi else echo "num1,num2,ope must be not null" exit 11 fi # 开始计算 if [ "$ope" == "+" ] then res=$(($num1+$num2)) elif [ "$ope" == "-" ] then res=$(($num1-$num2)) elif [ "$ope" == "*" ] then res=$(($num1*$num2)) elif [ "$ope" == "/" ] then res=$(($num1/$num2)) else echo "ope error" fi echo "res:$res"
sum = $(($num1+$num2)),=前后不能有空格吧,得是sum=$(($num1+$num2))
if ["$ope"=="+"];then 这里的应该这样 if [ "$ope" == "+" ] ;then
明白了吗,2个等号旁边要有空格,2个中括号跟双引号的内容之间也要有空格,目前发现这个问题
一个一个判断没必要把if都套起来吧,可以拆开来写,一层层的if强迫症看着难受。
13行先处理为空的话,可能可读性会强一些,34行的else距离太远了,不好看
不会返回空,sed 's/[0-9]//g'这段代码只是替换数字而已,遇到字母不会替换,所以最后得到的是去掉数字后的字符串
还有一个问题,也是第五行,第二个判断条件和第三个判断条件之间少了个 -a
…… then test1=$(echo $num1 | sed 's/[0-9]//g') test2=$(echo $num2 | sed 's/[0-9]//g') if [ -z "$test1" -a -z "$test2" ] …… 应该是在test2和这个if条件语句中出了问题。 你看下是test2语句的语法错误问题,还是if 条件语句有问题。
一、 ./if555.sh: line 22: + + + : syntax error: operand expected (error token is "+ ")
二、 运算结果:+ + +:
就是这里,有一个报错和一个技术难题。
一、报错那行的前面已经有if拦截了,怎么还会往下运行的呀?
二、第二个提示我知道是我if里的判断写错了,就是不知道如何判断前面有报错时不再显示此运算结果。
== 两边都要有一个空格
如果想把文件内的第三行内容黏贴到第十五行:
1.进入你的文件,(处于命令模式,而不是编辑模式)
2.将你的光标移到你的第三行的开头(用方向键)
3,按下v,(你发现切换到可视模式了),按方向键,知道选中你想要的内容
4.按y,再将光标移到第十四行末尾。
5.按p。完成
此方法可以用于多行的粘贴->复制
若想剪切->复制的话就更简单了(只能用于单行)
1.进入你的文件,(处于命令模式,而不是编辑模式)
2.将你的光标移到你的第三行的开头(用方向键)
3.按两下d(发现第三行内容不见了)
4,再将光标移到第十四行末尾,按p。
3
在GUI下:可按i进入插入模式,使用鼠标拖动反选要粘贴的内容,将光标移到要粘贴处,按鼠标中键(两键鼠标可同时按左右键)。
在纯文本终端下:
选定文本块,使用v
复制选定块到缓冲区,使用y
复制整行,用yy
在同一编辑窗打开第二个文件,用:sp [filename]
在多个编辑文件之间切换,用^ww
剪切块,用d
剪切整行用dd
粘贴缓冲区中的内容,用p
命令前面加数字表示重复次数,加字母表示使用的缓冲区名称。
获取帮助,用:help [内容或命令]
改为单引号括起来,,,你可以去查一下单括号,双括号,以及中括号的用法
sed ' s/[0-9]//g '
注意空格,看提示是sed 和s 之间没有空格,而且没有单引号
你执行这个sh脚本的命令有问题,少了/
正确的格式是
./if6.sh
然后你肯定不会退出了,那个/不能漏掉,漏掉就是执行完退出了登录,你自己可以试验一下
提示不已经告诉你了么 应该用"+" 双引号啊
可以实现,但是无法判断运算符号以外的符号是否为合法符号。例如:输入符号_,程序将会出现问题。解决:加入符号判断,若符号不为“+-*/”,进行报错。
双引号也是可以的,如果只是单纯的字符串单引号和双引号没有区别
首先要先定义符号变量sign="^[+,-,*,/]$"
然后判断ope是否符合sign正则表达
if [ "$ope" =~ $sign ]
注意语法格式。
条件判断语句里面 $ope 加上 双引号
*代表的带前目录的内容,当前目录尝试输入命令“ls *”,就不难理解*的含义啦
知道了,第一个判断条件里有写-n“$ope”
有两个问题:
1,只在加法处有输出
2,if [ "$ope"=='+' ] 判断符两边需要有空格
13行 if 和 [ 之间要有空格,
16 19 22 行 elif 和 [ 之间要有空格,
改完即可.
shell不支持浮点型,只支持整型和字符型,但可以bc、awk命令进行浮点运算,百度一下就有很多示例。
微软输入法