目录
一、数值变量的运算及特殊变量
在 Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算
整数值的运算主要通过内部命令 expr 进行
运算符与变量之间必须有至少一个空格。
运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
运算符号:$(()) 和$[]
运算命令:expr和let
- expr:特殊字符需要转义
- let:不需要转义特殊字符
运算工具:bc(系统自带)
- 可以取余
1.1 expr 命令
expr 命令:不仅可以运算,还支持输出到屏幕
常用的 几种运算符如下所述。
+:加法运算。
-:减法运算。
\*:乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符。
/:除法运算。
%:求模运算,又称为取余运算,用来计算数值相除后的余数。
案例一:常量运算
案例二:变量运算
案例三
案例四:利用脚本算
[root@localhost ~]# vim test.sh ###进入编辑脚本 #!/bin/bash #1、定义输出的数字 read -p "请输入第一个数字:" num1 read -p "请输入第二个数字:" num2 #2、定义执行的加法运算操作 sum=`expr $num1 + $num2` echo "求和数为:$sum" [root@localhost ~]# chmod +x test.sh ###给予脚本执行权限 [root@localhost ~]# sh test.sh 请输入第一个数字:20 请输入第二个数字:30 求和数为:50
1.2 数值运算
- $[] 和 $(()) 必须要和echo在一起用因为他只能运算无法输出结果;
- 总结:进行算术运算和数值比较
1.2.1 $(()) 运算
双小括号
- 整数扩展。这种扩展计算是整数型的计算,不支持浮点型。
- ((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者是"假",而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。若是逻辑判断,表达式exp为真则为1,假则为0。
- 只要括号中的运算符、表达式符合c语言运算规则,都可用在((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为 95(16进位转十进制)
- 单纯用(())也可重定义变量值,比如a=5;((a++))可将 $a 重定义为 6
- 常用于算术运算比较,双括号中的变量可以不使用符号前缀·。括号内支持多个表达式用逗号分开。只要括号中的表达式符合。c语言运算规则,比如可以直接使用for((i=0 ; i < ; 5 ; i++)),如果不使用双括号,则为for i in seg 04或者 for i in 0..4。再如可以直接使用if((符号前缀。括号,内支持多个表达式用逗号分开。只要括号中的表达式符合c语言运算规则,比如可以直接使用for(( i=0 ; i< ; 5 ; i++)),如果不使用双括号,则为for i in seq 0 4或者for i in {0..4}。再如可以直接使用 if ((符号前缀。括号内支持多个表达式用逗号分开。只要括号中的表达式符合c语言运算规则,比如可以直接使用for((i=0 ; i<5 ; i++)),如果不使用双括号,则为for i in seq 04或者for i in 0..4。再如可以直接使用 if((1<5)),如果不使用双括号,则为if [ $i -lt 5]。
案例:
##可以有负数
1.2.2 $[ ] 整数运算
- $[ ] 变量的运算,可省略 [ ] 里的 $
- 整数运算包含特殊字符,因此特殊字符不需要转义
- 遵循先乘除后加减,否则需要用括号括起来表示优先运算
案例
1.3 let 运算命令
- let的运算可以改变变量本身的值,但不显示结果,需要echo,其他的运算方式可以做运算但不改变变量本身的值
- let 运算是 shell 内部命令,专注数学运算,语法简洁,不需要运算符,特殊字符转义,对于简答的运算数值操作,推荐使用 let 运算,简洁明了;
案例:
下面运算结果一样,只是输出方式不同
1.4 bc 运算命令
- 使用bc进行运算,支持小数运算,但在脚本中不可直接使用否则会进入交互界面,可以用echo结合管道使用
案例
赋值运算
真假判断
1.5 常用的运算表达式
- i=$(expr 12 \* 5)
- i=$((12 * 5))
- i=[12 * 5]
- let i=12*5
- i++ 相当于 i=$[$i+1]
- i-- 相当于 i=$[$i-1]
- i+=2 相当于 i=$[$i+2]
二、特殊变量
2.1 环境变量
- 环境变量指的是出于运行需要而由 Linux 系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等;
- 环境变量的值由 Linux 系统自动维护,会随着用户状态的改变而改变;
- 使用 env 命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途;(一般都用全大写定义,注意和自定义变量区分)
- USER 表示用户名称,USER表示当前账户的账户名称等
- HOME 表示用户的宿主目录
- LANG 表示语言和字符集
- PWD 表示当前所在的工作目录
- PATH 表示命令搜索路径等
- RANDOM表示随机数,会返回0-32767的整数
执行应用程序文件,将/root 加入到PATH环境变量当中后,在运行的时候就会加载命令,就可以使用这个命令
PATH 变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”
因xxt.sh不在 $PATH 的目录里面,所以系统无法识别无法直接用,需要跟上绝对路径使用该脚本
永久性设置路径
案例
方法一:
2.2 只读变量
Shell 变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变 量。在创建变量的时候可将其设置为只读属性,也可以将已存在的变量设置为只读属性,只 读变量主要用于变量值不允许被修改的情况
只读变量不可以改变值也不可以被删除,除非退出;
### readonly用来定义只读变量,一旦使用readonly定义的变量在脚本中就不能更改
### unset 命令也无法退出,需要退出登录
2.3 位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量;
- 位置变量也称为位置参数,使用 $1、$2、$3、…、$9 表示
- 命令或脚本本身的名称使用 “$0” 表示
案例:
案例二
三、预定义变量
预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而 不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示;
- $#:表示命令行中位置参数的个数。
- $*:表示所有位置参数的内容,这些内容当做一个整体
- $@:表示列出所有位置参数,但是是以单个的形式的列出
- $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0 值均表示执行出现异常。
- $0:表示当前执行的脚本或程序的名称
- $$:表示返回当前进程的进程号
- $!:返回最后一个后台进程的进程号
案例
案例二
案例三
3.1 $* 和 $@ 的区别
- $*、$@:表示命令或脚本要处理的参数。
- $*:把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4"。
- $@:把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1""$2""$3""$94"。
注意:
- $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。
案例:区分 $* 和 $@
案例二
总结:
- $*: 是将参数全部当做一个整体
- $@: 是将参数每一个都当做单独的个体