运维界的卡乐咪

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

posted on 2020-02-29 16:46  卡乐咪运维  阅读(381)  评论(0)    收藏  举报