1.shell数值运算方法
expr、(())、let、bc、$[]、awk、typeset
bc 支持小数运算,也可以支持整数运算
实例:将计算从1到10的和
方法一:
root@localhost ~]# echo {1..10}|tr " " "+"
1+2+3+4+5+6+7+8+9+10
[root@localhost ~]# echo {1..10}|tr " " "+"|bc
55
[root@localhost ~]# echo `echo {1..10}|tr " " "+"`=`echo {1..10}|tr " " "+"|bc`
1+2+3+4+5+6+7+8+9+10=55
方法二:
[root@localhost ~]# echo "`seq -s '+' 10`="$((`seq -s "+" 10`))
1+2+3+4+5+6+7+8+9+10=55
2.shell变量的输入
Shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入获得,read为bash内置命令,可以通过help read查看帮助
语法格式:read [参数] [变量名]
常用参数:-p prompt:设置提示信息。
-t tomeout:设置输入等待的时间
实例1:
read的基本读入
[root@localhost ~]# read -p "please input two num:" num1 num2
please input two num:1 2
[root@localhost ~]# echo $num1 $num2
1 2
[root@localhost ~]# read -t 3 -p "please input two num:" num1 num2
实例2:
用read接收标准输入,进行数字运算
#!/bin/sh
read -p "please input two num:" num1 num2
a=$num1
b=$num2
echo "$a-$b =$(($a - $b))"
echo "$a+$b =$(($a + $b))"
echo "$a*$b =$(($a * $b))"
echo "$a/$b =$(($a / $b))"
echo "$a**$b =$(($a ** $b))"
echo "$a%$b =$(($a % $b))"
[root@localhost ~]# sh test.sh
please input two num:8 3
8-3 =5
8+3 =11
8*3 =24
8/3 =2
8**3 =512
8%3 =2
实例3:
read接收标准输入,并判断输入是否为整数以及个数,进行算数运算
#!/bin/sh
read -p "please input two num:" num1 num2
a=$num1
b=$num2
#no1
[ -z "$a" -o -z "$b" ]&&{
echo "must input be int."
exit 1
}
#no2
expr $a + $b + 1 &>/dev/null
[ $? -ne 0 ]&&{
echo "you must input be int."
exit 2
}
#no3
echo "$a-$b =$(($a - $b))"
echo "$a+$b =$(($a + $b))"
echo "$a*$b =$(($a * $b))"
if [ $b -eq 0 ];then
echo "$b=0 被除数不能为0!"
else
echo "$a/$b =$(($a / $b))"
echo "$a%$b =$(($a % $b))"
fi
echo "$a**$b =$(($a ** $b))"
3.条件测试与比较
条件测试通常分3种语法形式:
语法格式1:test<测试表达式>
语法格式2:[<测试表达式>]
语法格式2:[[<测试表达式>]]
说明:a.上述语法格式1和语法格式2的写法是等价的,语法格式3为扩展的test命令,推荐语法格式2
b.在[[]]中可以使用通配符进行模式匹配。&&、||、>、<等操作符可以应用于[[]]中,但不能应用于[]中。
c.对于整数的关系运算,也可以使用Shell算数运算符(())
实例1:
用test格式判断
[root@localhost ~]# test -f /etc/hosts && echo 1 ||echo 0 ==> -f 判断文件是否存在
1
[root@localhost ~]# test -x test.sh && echo 1||echo 0 ==> -x 判断文件是否可执行
0
[root@localhost ~]# chmod +x test.sh
[root@localhost ~]# test -x test.sh && echo 1||echo 0
1
[root@localhost ~]# test -d /etc&& echo 1||echo 0 ==> -d 判断文件是否为目录
1
[root@localhost ~]# test -d /etc/hosts&& echo 1||echo 0
0
[root@localhost ~]# test -z "zhangsan"&& echo 1||echo 0 ==> -z 判断字符串是否为空
0
[root@localhost ~]# test -z ""&& echo 1||echo 0
1
实例2:
用[]格式判断
[root@localhost ~]# [ -f /etc/hosts ]&&echo 1||echo 0
1
[root@localhost ~]# [ -f /etc/hosts11 ]&&echo 1||echo 0
0
[root@localhost ~]# [ -d /etc/hosts11 ]&&echo 1||echo 0
0
[root@localhost ~]# [ -d /etc/ ]&&echo 1||echo 0
1
[root@localhost ~]# [ -x test.sh ]&&echo 1||echo 0
1
单[]要接两个判断条件可以接-a (and)、-o(or)来实现
[root@localhost ~]# [ -d /etc/ -a -f /etc/hosts ]&&echo 1||echo 0
1
[root@localhost ~]# [ -d /etc/ -o -f /etc/hosts1 ]&&echo 1||echo 0
1
[root@localhost ~]# [ -d /etc/ -a -f /etc/hosts1 ]&&echo 1||echo 0
0
实例3:
用[[]]格式判断
[root@localhost ~]# [[ -d /etc/ ]]&&echo 1||echo 0
1
[root@localhost ~]# [[ -d /etc/ && -f /etc/hosts ]]&&echo 1||echo 0 ==>区别在于[[]]中可以接&&、||等条件
1
[root@localhost ~]# [[ -d /etc/ && -f /etc/hosts1 ]]&&echo 1||echo 0
0
[root@localhost ~]# [[ -d /etc/ || -f /etc/hosts1 ]]&&echo 1||echo 0
1
浙公网安备 33010602011771号