Shell脚本学习_运算符

目录

一、算数运算符

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
该文件可写
该文件可读
该文件不可执行
该文件是普通文件
该文件不是目录
该文件存在
该文件不为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值