shell运算
一、赋值运算
赋值运算符 =
a=10
name='baism'
重点:字符串必须用引号引起来
二、算术运算(四则运算)
2.1 运算符与命令
四则运算符: + - * \ 【加减乘除】
扩展: % ** 【取余 开方】
运算命令:
- 整形运算 – expr – let – $(()) – bc
- 浮点运算 – bc
2.2 整形运算
expr 命令:只能做整数运算,格式比较古板,注意空格
$ expr 1 + 1 2
$ expr 5 - 2 3
$ expr 5 \* 2 #注意*出现应该转义,否则认为是通配符 10
$ expr 5 / 2 2 [root@zutuanxue ~]# expr 5 % 2 1
expr的特殊用法:可判断字符串长度,延伸(判断文件名长度)
expr 字符串 ":" ".*字符"
$ expr 123456.jpg : .*j
8
$ expr 123456.jpg : .*jpg
10
let命令:只能做整数运算,且运算元素必须是变量,无法直接对整数做运算
$ let a=100+3;echo $a 103 root@zutuanxue ~]# let a=100-3;echo $a 97
$ let a=100/3;echo $a 33
$ let a=100*3;echo $a 300
$ let a=100%3;echo $a 1
$ let a=100**3;echo $a 1000000
$ a=100
$ let a++;echo $a 101
$ let a--;echo $a 100
$ let a-=3;echo $a 97
$ let a+=5;echo $a 102
双小圆括号运算,在shell中(( ))也可以用来做数学运算。
$ echo $(( 100+3)) 103
$ echo $(( 100-3)) 97
$ echo $(( 100%3)) 1
$ echo $(( 100*3)) 300
$ echo $(( 100/3)) 33
$ echo $(( 100**3)) #开方运算 1000000
2.3 浮点运算
浮点运算是采用的命令组合的方式来实现的 echo “scale=N;表达式”|bc scale设置为希望在计算结果中保留的小数位数
$ echo "scale=2;3+100"|bc 103
$ echo "scale=2;100-3"|bc 97
$ echo "scale=2;100/3"|bc 33.33
$ echo "scale=2;100*3"|bc 300
三、比较运算
整形比较运算
运算符解释
-eq 等于 equal
-gt 大于 greater than
-lt 小于 less than
-ge 大于或等于
-le 小于或等于
-ne 不等于 not equal
注意,linux命令test中使用该表达式只能比较两个整数的关系,不会返回结果,需要通过$?才能看到结果;
$ test 100 -gt 200;echo $?
1
$ test 100 -le 200;echo $?
0
shell中如何比较浮点数?
解决思路如下:
1)两个数据同时放大到整数倍
2)处理掉小数点位,保留整数位
3)进行整形判断
# 1、交互或者外传参的方式获得两个整数
#$1 $2
[ $# -lt 2 ]&&echo "need two args"&&exit 1
#采用外传参的方式接收数据并放大100倍,并处理为整数
num1=`echo "scale=2;$1*100"|bc|cut -d "." -f1`
num2=`echo "scale=2;$2*100"|bc|cut -d "." -f1`
# 2、比较num1与num2
字符串比较运算
运算符解释
== 等于
!= 不等于
-n 检查字符串的长度是否大于0 (非空字符串)
-z 检查字符串的长度是否为0 (空字符串)
# test -n "$name";echo $?
1
# test -z "$name";echo $?
0
逻辑运算
- 逻辑与运算 &&
- 逻辑或运算 ||
- 逻辑非运算 !
文件判断
命令功能: 文件类型、权限、新旧判断
命令用法
test [命令选项] 表达式
命令选项
-d 检查文件是否存在且为目录
-e 检查文件是否存在
-f 检查文件是否存在且为文件
-s 检查文件是否存在且不为空
-r 检查文件是否存在且可读
-w 检查文件是否存在且可写
-x 检查文件是否存在且可执行
-O 检查文件是否存在并且被当前用户拥有
-G 检查文件是否存在并且默认组为当前用户组
-nt file1 -nt file2 检查file1是否比file2新
-ot file1 -ot file2 检查file1是否比file2旧
-ef file1 -ef file2 检查file1是否与file2是同一个文件,判定依据的是i节点
以上只列出部分命令选项,详细的可以通过:man test获得。
注意事项
- 用于比较文件路径是相对你运行该脚本的目录而言的。 如果你要检查的文件已经移走, 就会出现问题
- 在你尝试使用-nt或-ot比较文件之前,必须先确认文件是存在的。
例:
文件类型
$ test -f /etc/passwd;echo $?
0
$ test -f /etc;echo $?
1
$ test -d /etc;echo $?
0
权限判断
$ test -x /root/anaconda-ks.cfg ;echo $?
1
$ ll /root/anaconda-ks.cfg
-rw-------. 1 root root 1216 6月 26 09:06 /root/anaconda-ks.cfg
$ test -r /root/anaconda-ks.cfg ;echo $?
0
$ test -w /root/anaconda-ks.cfg ;echo $?
0
条件测试
test命令
if test condition
then
commands;
fi
如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0
如果条件不成立,test命令就会退出并返回非零的退出状态码,这使得if-then语句不会再被执行。
test命令可以判断三种条件:
- 数值比较
- 字符串比较
- 文件比较
if [ condition ]
bash shell 提供另一种条件测试方法,无需在if-then语句中声明test命令。
if [ condition ]
then
commands;
fi
方括号定义了测试条件。注意,第一个方括号之后,第二个方括号之前,都必须加一个空格。
复合条件测试
使用布尔逻辑组合测试
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
#!/bin/bash
# testing compound compariscons
if [ -d $HOME ] && [ -w $HOME/testing ]
then
echo "文件存在且可写入"
else
echo "文件不可写入"
fi
if-then的高级特性
双括号
((expression))
双括号允许在比较过程中使用高级数学表达式。test命令只能在比较中使用简单的算术操作。
expression 可以是任意的数学赋值或比较表达式
#!/bin/bash
# using double parenthesis
#
vall=10
if (( $vall ** 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "The square of $vall is $val2"
fi
双方括号
[[ expression ]]
双方括号提供了针对字符串比较的高级特性。
它提供了test 命令未提供的另一个特性——模式匹配。在模式匹配中,可以定义一个正则表达式来匹配字符串值。
#!/bin/bash
# using pattern matching
#
vall=10
if [[ $USER == r* ]]
then
echo "Hello $USER"
else
echo "Sorry, I do not know you"
fi