目录
一、算数运算符
1、expr命令:
2、算数运算符介绍:
3、使用 ( ( ) ) 进行运算:
4、bc命令:
1.bc中互动式的数学运算:
2.非互动式的管道运算:
3.非互动式的输入重定向运算:
二、比较运算符
1、整数比较运算符:
2、字符串比较运算符:
3、[ [ ] ] 和 [ ] 的区别:
三、布尔运算符
四、逻辑运算符
五、文件测试运算符
1、linux系统文件类型介绍:
2、常用操作符介绍:
一、算数运算符
1、expr命令:
简介:
expr 是一款表达式计算工具,使用它能完成表达式的求值操作,expr被称为“求值表达式”,可以实现整数计算、还可以结合一些选项对字符串进行处理。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 命令和 expr命令,expr 最常用。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):基本语法:
expr 运算符表达式 或者 result=`expr 运算符表达式 `
1.计算语法:
expr 算数运算符表达式
例如:
[zhangjiajia@localhost ~]$ expr \( 1 + 2 \) \* 3 #括号和乘法需要转义
9
[zhangjiajia@localhost ~]$
2.计算完后赋值语法:
result=`expr 1 + 2`
例如:
[zhangjiajia@localhost ~]$ a=`expr 1 + 3`
[zhangjiajia@localhost ~]$ echo "a的值为:$result"
a的值为:3
[zhangjiajia@localhost ~]$ echo "1+7=`expr 1 + 7`"
1+7=8
#注意:
#表达式和运算符之间要有空格,例如 1+3 是不对的,必须写成 1 + 3,这和我们之前学的大多数编程语言不同
#完整的表达式要被 ` ` 包含,这个字符不是常用的单引号,在 Esc 键下边。
3.计算字符串长度
expr length 字符串
例如:
[zhangjiajia@localhost ~]$ expr length "12345"
5
4.截取字符串
expr substr 字符串 start end
例如:
[zhangjiajia@localhost ~]$ expr substr "12345" 1 3
123
5.查找第一个字符出现的位置
expr index 字符串 需查找的字符
例如:
[zhangjiajia@localhost ~]$ expr index "12345" 5
5
2、算数运算符介绍:
假设变量a为1,变量b为2:
运算符 | 例如 |
---|---|
+ 加法 | expr $a + $b 结果为3 |
- 减法 | expr $a - $b 结果为-1 |
* 乘法(需转义) | expr $a \* $b 结果为2 |
/ 除法 | expr $a / $b 结果为0 |
% 取余 | expr $a % $b 结果为1 |
= 赋值 | a=$b 将b的值赋值给a |
例如:
yun.sh脚本文件内代码为:
[zhangjiajia@localhost ~]$ vim yun.sh
#!/bin/bash
read -p "请输入第一个数字" a
read -p "请输入第二个数字" b
echo "a的值为${a},b的值为${b}"
echo "a+b=`expr $a + $b`"
echo "a-b=`expr $a - $b`"
echo "a*b=`expr $a \* $b`"
echo "a/b=`expr $a / $b`"
echo "a%b=`expr $a % $b`"
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b : a 不等于 b"
fi
运算结果为:
[zhangjiajia@localhost ~]$ sh yun.sh
请输入第一个数字1
请输入第二个数字3
a的值为1,b的值为3
a+b=4
a-b=-2
a*b=3
a/b=0
a%b=1
1 -eq 2 : a 不等于 b
3、使用 ( ( ) ) 进行运算:
介绍:
和expr一样也是只能对整数进行运算。
但是,更推荐使用(( )) 来进行运算(不需要转义,可以进行多表达式同时运算)
例如:
[zhangjiajia@localhost ~]$ vim 1.sh
#!/bin/bash
#基本写法
((a=1+6))
((b=a-1))
((c=a+b))
echo "a=${a},b=${b},c=${c}"
#赋值写法
a=$((1+6))
b=$((a-1))
c=$((a+b))
echo "a=${a},b=${b},c=${c}"
echo "1+6=$((1+6))"
#多个表达式写法
((a=1+6,b=a-1,c=a+b))
echo "a=${a},b=${b},c=${c}"
结果为:
[zhangjiajia@localhost ~]$ sh 1.sh
a=7,b=6,c=13
a=7,b=6,c=13
1+6=7
a=7,b=6,c=13
4、bc命令:
1.bc中互动式的数学运算:
介绍:
bc命令支持浮点型,支持语句的交互式执行。可以进行进制转换bc从标准输入中读取。所有代码在读取时执行。如果文件中包含停止处理器的命令,bc将永远不会从标准输入中读取。
支持的运算包括:+ 加法 - 减法 * 乘法 / 除法 ^ 指数 % 余数。
语法:bc [ 选项 ] [ 参数 ]
bc命令内置变量介绍:
变量名 | 作用 |
---|---|
scale | 指定精度,也即小数点后的位数,对计算 |
ibase | 指定输入的数字的进制,默认为十进制。 |
obase | 指定输出的数字的进制,默认为十进制。 |
last或者. | last或者.获取最近计算打印结果的数字 |
bc命令内置数学函数介绍:
函数名 | 作用 |
---|---|
s(x) | 计算X的正弦值,x是弧度值。 |
c(x) | 计算X的余弦值,x是弧度值。 |
a(x) | 计算x的反正切值,返回弧度值。 |
l(x) | 计算x的自然对数。 |
e(x) | 求e的x次方。. |
j(n,x) | 贝塞尔函数,计算从n到x的阶数。 |
基本用法:
[zhangjiajia@localhost ~]$ bc -q
1+2
3
11.2+33.3
44.5
(1+1)*2
4
10/3
3
scale=2;
10/3
3.33
scale=4;
10/3
3.3333
obase=8;
100
144
[zhangjiajia@localhost ~]$ bc -q
ibase=2;obase=10;
queit
0
quit
[zhangjiajia@localhost ~]$ bc -q
ibase=2;111
7
quit
[zhangjiajia@localhost ~]$ bc -lq
e(2)
7.38905609893065022723
[zhangjiajia@localhost ~]$ vim 2.txt
14567+3456
12345*3456/453
76345.1432+4567345324/3246567
#对文件内的数字进行运算
[zhangjiajia@localhost ~]$ bc -q 2.txt
18023
94181
77751.1432
2.非互动式的管道运算:
介绍:
借助管道使用bc计算器语法,直接进行bc的表达式计算输出
语法:
echo "expression" | bc [ 选项 ]
注意:
expression必须符合bc命令要求的公式
expression表达式里面可以引用shell变量
例如:Shell变量a=2,在表达式里面引用的语法为:$a
例如:
[zhangjiajia@localhost ~]$ echo "1+1" | bc
2
[zhangjiajia@localhost ~]$ echo "10/3" | bc
3
[zhangjiajia@localhost ~]$ echo "scale=3;10/3" | bc
3.333
[zhangjiajia@localhost ~]$ echo "e(2)" | bc -l
7.38905609893065022723
[zhangjiajia@localhost ~]$ echo "obase=2;7" | bc -l
111
[zhangjiajia@localhost ~]$ a=2
[zhangjiajia@localhost ~]$ echo "b=$a+2;b" | bc
4
#两种赋值方法
[zhangjiajia@localhost ~]$ a=`echo "b=$a+2;b" | bc`
[zhangjiajia@localhost ~]$ echo $a
4
[zhangjiajia@localhost ~]$ a=$(echo "b=$a+2;b" | bc)
[zhangjiajia@localhost ~]$ echo $a
6
3.非互动式的输入重定向运算:
介绍:
将计算表达式输出给bc去执行,特定类似于文件中输入,可以输入多行表达式,更加清晰。
语法介绍:
#方法1:
var_name=`bc [选项] << EOF
第一行表达式1
第二行表达式2
......
EOF
`
#方法2:
var_name=$( bc [选项] << EOF
第一行表达式1
第二行表达式2
......
EOF
)
例如:
[zhangjiajia@localhost ~]$ ^C
[zhangjiajia@localhost ~]$ b=`bc -l << EOF
> 1+1+1.1
> 1/3+12*7
> EOF
> `
[zhangjiajia@localhost ~]$ echo $b
3.1 84.33333333333333333333
[zhangjiajia@localhost ~]$ c=$(bc -l << EOF
> scale=3;10/3
> obase=2;100
> EOF
> )
[zhangjiajia@localhost ~]$ echo $c
3.333 1100100
二、比较运算符
1、整数比较运算符:
简介:
整数比较运算符只支持整数,不支持小数与字符串,除非字符串的值是整数数字。
通常配合if-else语句使用。
语法1:
下表中假设a=1、b=2:
例如:
[zhangjiajia@localhost ~]$ [ 1 -eq 2 ]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [ 1 -ne 2 ]
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ [ 1 -gt 2 ]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [ 1 -lt 2 ]
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ [ 1 -ge 2 ]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [ 1 -le 2 ]
[zhangjiajia@localhost ~]$ echo $?
0
语法2:
例如:
[zhangjiajia@localhost ~]$ ((1<2))
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ ((1>2))
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ ((1<=2))
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ ((1>=2))
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ ((1==2))
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ ((1!=2))
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ (("1"=="2"))
[zhangjiajia@localhost ~]$ echo $?
1
2、字符串比较运算符:
简介:
可以比较两个变量,变量的类型可以使数字(整数、小数)与字符串
字符串的比较可以使用 [ [ ] ] 和 [ ] 两种方式。
语法:
例如:
[zhangjiajia@localhost ~]$ [[ "1" == "2" ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ 1.1 == 2 ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ 1 == 2 ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ "abc" == "abC" ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ "abc" != "abC" ]]
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ [[ "abc" > "abC" ]]
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ [[ "abc" > "abC" && "abc" == "abC" ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ "abc" > "abC" || "abc" == "abC" ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ -z "abc" ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ -n "abc" ]]
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ a="abc"
[zhangjiajia@localhost ~]$ [[ $a ]]
[zhangjiajia@localhost ~]$ echo $?
0
3、[ [ ] ] 和 [ ] 的区别:
首先:
不推荐用 (( )) 来比较、既不能比较小数又不能比较字符串、只能比较整数。
区别1:是否会有单词分隔的发生?
[ [ ] ] 不会发生单词分隔
[ ] 会发生单词分隔
所以,更推荐使用 [ [ ] ] 来比较
例如:使用 [ ] 会出现错误
[zhangjiajia@localhost ~]$ a="a"
[zhangjiajia@localhost ~]$ b="a b c"
[zhangjiajia@localhost ~]$ [[ $a == $b ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [ $a == $b ]
-bash: [: 参数太多
三、布尔运算符
语法:
例如:
[zhangjiajia@localhost ~]$ [[ 1 > 2 ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ ! 1 > 2 ]]
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ [ 1 \> 2 -o 1 == 1 ]
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ [ 1 \> 2 -a 1 == 1 ]
[zhangjiajia@localhost ~]$ echo $?
1
四、逻辑运算符
语法:
例如:
[zhangjiajia@localhost ~]$ [[ 1 > 2 && 1 == 1 ]]
[zhangjiajia@localhost ~]$ echo $?
1
[zhangjiajia@localhost ~]$ [[ 1 > 2 || 1==1 ]]
[zhangjiajia@localhost ~]$ echo $?
0
[zhangjiajia@localhost ~]$ [[ ! 1 > 2 ]]
[zhangjiajia@localhost ~]$ echo $?
0
五、文件测试运算符
1、linux系统文件类型介绍:
-:普通文件
d:目录文件
l:链接文件
如:
[zhangjiajia@localhost ~]$ ll /dev
lrwxrwxrwx. 1 root root 3 8月 24 02:35 cdrom -> sr0
b:块设备文件
如:
[zhangjiajia@localhost ~]$ ll /dev | grep usb
crw-------. 1 root root 247, 0 8月 24 02:35 usbmon0
crw-------. 1 root root 247, 1 8月 24 02:35 usbmon1
crw-------. 1 root root 247, 2 8月 24 02:35 usbmon2
c:字符设备文件
如:
[zhangjiajia@localhost ~]$ ll /dev | grep usb
crw-------. 1 root root 247, 0 8月 24 02:35 usbmon0
crw-------. 1 root root 247, 1 8月 24 02:35 usbmon1
crw-------. 1 root root 247, 2 8月 24 02:35 usbmon2
p:管道文件
2、常用操作符介绍:
属性检测描述如下: 黄色的是较为常见的。
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] |
-s file | 检测文件是否不为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] |
例如:
[zhangjiajia@localhost ~]$ vim 123.sh
#!/bin/bash
file1="/home/zhangjiajia/read1.sh"
#测试是否可写
if [[ -w $file1 ]]
then
echo "该文件可写"
else
echo "该文件不可写"
fi
#测试是否可读
if [[ -r $file1 ]]
then
echo "该文件可读"
else
echo "该文件不可读"
fi
#测试是否可执行
if [[ -x $file1 ]]
then
echo "该文件可执行"
else
echo "该文件不可执行"
fi
#测试是否是普通文件
if [[ -f $file1 ]]
then
echo "该文件是普通文件"
else
echo "该文件不是普通文件"
fi
#测试是否是目录
if [[ -d $file1 ]]
then
echo "该文件是目录"
else
echo "该文件不是目录"
fi
#测试文件是否存在
if [[ -e $file1 ]]
then
echo "该文件存在"
else
echo "该文件不存在"
fi
#测试是否不为空
if [[ -s $file1 ]]
then
echo "该文件不为空"
else
echo "该文件为空"
fi
结果为:
[zhangjiajia@localhost ~]$ sh 123.sh
该文件可写
该文件可读
该文件不可执行
该文件是普通文件
该文件不是目录
该文件存在
该文件不为空