首页 > 系统相关 >Shell脚本学习_运算符

Shell脚本学习_运算符

时间:2024-08-24 22:26:46浏览次数:9  
标签:脚本 文件 Shell bc zhangjiajia echo 运算符 expr localhost

目录

一、算数运算符

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

标签:脚本,文件,Shell,bc,zhangjiajia,echo,运算符,expr,localhost
From: https://blog.csdn.net/zjh1418739290/article/details/141474261

相关文章

  • 【Python脚本】爬取网络小说
    作为重度小说爱好者,小说下载网站经常被打击,比如:笔趣阁,奇书网,爱书网,80电子书.这些网站的下载链接经常会失效,所以,我想自己动手写一个爬虫程序,抓取网络小说,并下载到本地.给出两种思路的python脚本,脚本并不对所有小说网站通用,具体使用时,需要根据网站的网页结构进行......
  • C++ //练习 19.23 为你的Token类添加移动构造函数和移动赋值运算符。
    C++Primer(第5版)练习19.23练习19.23为你的Token类添加移动构造函数和移动赋值运算符。环境:LinuxUbuntu(云服务器)工具:vim 代码块classToken{ public: Token():tok(INT),ival(0){} Token(constToken&t):tok(t.tok){copyUnion(t);} Token&operator=(......
  • 运算符 类定义 Math类的使用 数组的使用
    1.基本的算术运算符5个:+ - * / %都是双目运算符(两个操作数),其中%要求的两个操作数必须为整数。2.自增、自减运算符++ --注意作为前缀和后缀的用法不同.3.表达式计算中的数据类型转换(1)自动类型转换:当参与运算的两个操作数类型不同时,先把低类型的数据转换为高类......
  • bat脚本的基本操作
    一、前提最近在整理之前的资料资料,仅做记录二、概况ASSOC显示或修改文件扩展名关联。ATTRIB显示或更改文件属性。BREAK设置或清除扩展式CTRL+C检查。BCDEDIT设置启动数据库中的属性以控制启动加载。CACLS显示或修改文......
  • pg数据库备份脚本
    一、前提①linux服务器;②本地安装有pg数据库,并有pg_dump命令二、准备备份脚本备份脚本/pie/data/backup_script26.sh内容如下:=============================#!/bin/bash#设置数据库连接变量DB_HOST="172.30.3.26"#数据库主机地址DB_PORT="5432"#数据库端口,PostgreSQL......
  • 使用GPT设计一个脚本语言解释器
    Q:我们重新开始设计,每个Parser必须包含两个方法,一个方法是parse(self,main_parser),另一个方法是try_parse(tokens,position)。parse方法里转调用try_parse,只有try_parse返回非空结果和位置信息时在parse方法里才会真正改变main_parser的position。每个parser的try_parse方法里,......
  • Python 教程(三):Python运算符合集
    Python中常用的一些运算符类型算术运算符+:加法-:减法*:乘法/:除法(结果为浮点数)%:取模(即除法余数)**:幂(指数)//:整除(结果为商的整数部分)示例代码: a=10b=3print("加法:",a+b)#输出13print("减法:",a-b)#输出7print("乘法:",a*b)#输出3......
  • power shell实现文任意件夹目录名称写入指定文本文件中
    在PowerShell中,你可以使用脚本来遍历一个文件夹并将其目录名称写入到一个指定的文本文件中。以下是一个详细的步骤说明和示例脚本:步骤说明1.**打开PowerShell**:你可以通过开始菜单搜索“PowerShell”并打开它。2.**编写脚本**:使用PowerShell脚本语言编写一个脚本,该脚本将......
  • catvod、TVBox源的格式解析及合并多个源的内容(Python脚本)
    文章目录TVBox官网核心代码分析源内容的结构定义源内容的主体结构解析直播的结构解析ApiConfig其他处理代码核心类分析完整代码参考合并多个catvod、TVBox源的内容(Python脚本)可用catvod、TVBox源参考(最新接口)更新:解决Spider参数覆盖问题TVBox官网TVBox项目索引:htt......
  • 从网友探秘 《黑神话:悟空》 的脚本说说C#
    《黑神话:悟空》千呼万唤始出来。在正式发售后不到24小时,Steam在线玩家峰值突破222万,在Steam所有游戏在线玩家历史峰值中排名第二。第一拨玩家纷纷晒出好评,称这款现象级产品正式开启国产3A游戏(3A俗称:大量的资源、大量的金钱和大量的时间)元年,黑神话悟空是国内首款3A游戏,画面剧情都......