一、shell脚本中的变量
1.什么是变量
-
在编写程序时,通常会遇到被操作对象不固定的情况
-
我们需要用一串固定的字符来表示不固定的值这就是变量存在的根本意义
-
变量的实现原理就是内存存储单元的一个符号名称
2.变量命名规则
变量的名称中只能包含数字、大小写字母以及下划线
变量的名称只能用大小写字母及下划线开头
同一名称变量在多次被赋值时为覆盖动作
在企业代码规范化中变量的命名规则如下
简短全大写变量名 OPENLAB
首字母大写子类变量名 Openlab_Shell
驼峰类型变量名 kuberneteS_Api
只能包含字符,数字,下划线,且只能用字母和下划线开头:
3.变量的调用方法
$EASYLEE #表示取$EASYLEE这个变量的值
[root@lee ~]# EASYLEE=1
[root@lee ~]# echo $EASYLEE
1
4.字符的转义及应用
- 在shell中有很多本身有特殊功能的字符,比如空格井号等等
- 如果在给变量赋值或执行命令使用时我们只想使用这些符号本身那么就需要用到转义或引用
- 在shell中反斜杠表示转义,每个反斜杠只能转义一个字符
- 在shell中单引号表示强引用,我们可以把它看作批量转义,在单引号内的所有字符被视为字符本身
- 在shell中双引号表示弱引用,其和单引号的区别在于不能引用(` \ ! $)
代码示例如下:
[root@lee ~]# echo \#
#
[root@lee ~]# echo \# #
#
[root@lee ~]# echo \# \#
# #
[root@lee ~]# echo "# #"
# #
[root@lee ~]# echo "$5"
[root@lee ~]# echo '$5'
$5
5.变量的类型
从变量的作用范围来划分,变量分为函数级变量,环境级变量,用户级变量和系统级变量
函数级变量只在函数内生效通常用local来定义
vim test.sh
#!/bin/bash
ACTION () {
local a=1
echo $a
}
ACTION
echo $a
#sh test.sh
1
第二行显示为空
环境级别变量只在当前运行的shell中生效,shell关闭变量被释放
[root@lee ~]# export a=1
[root@lee ~]# vim test.sh
#!/bin/bash
echo $a
[root@lee ~]# sh test.sh
1
[root@lee ~]# exit
logout
[root@lee ~]# sh test.sh
显示为空
用户级变量只有登录系统的指定用户,此变量才生效
[root@lee ~]# useradd lee
[root@lee ~]# vim ~lee/.bash_profile
export a=1
[root@lee ~]# vim /mnt/test.sh
[root@lee ~]# sh /mnt/test.sh
显示为空
[root@lee ~]# su - lee
[lee@lee ~]$ sh /mnt/test.sh
1
系统级变量是系统中的永久设定,所有用户都可以使用,系统变量通常被保存到/etc/profile中
]# vim /etc/profile.d/a.sh
#!/bin/bash
export b=1
[root@lee ~]# source /etc/profile.d/a.sh
[root@lee ~]# vim /mnt/test.sh
#!/bin/bash
echo $b
[root@lee ~]# sh /mnt/test.sh
1
- 在系统中通常设置系统变量是编辑文件更加安全
- 文件修改完毕后需要用source命令使其生效
6.常见的系统及变量
在系统中被预设的变量如下
- PATH指定命令执行路径是非常有用
- 如果我想在当前用户中可以用相对路径方式调用/mnt下的所有可执行文件
临时修改:
永久修改,从自己的家目录的修改配置文件:
7.特殊变量定义方式
7.1.用命令的执行结果定义变量
在执行命令时如果想让指定命令优先执行可以使用 $(cmd)或``
7.2.传参变量
很多情况下,shell脚本需要接受用户的输入,根据用户的输入来执行不同的操作。
从命令行传递给shel!脚本的参数又称为叫做位置参数,shell脚本会根据参数的位置使用不同的位置参数变量读取他们的值。
脚本
@和*区别
[root@lee ~]# echo
$$46058
[root@lee ~]# ps
PID TTY TIME CMD
46058 pts/0 00:00:00 bash
46170 pts/0 00:00:00 ps
[root@lee ~]# echo $?
0
[root@lee ~]# ls haha
ls: cannot access 'haha': No such file or directory
[root@lee ~]# echo $?
2
7.3 交互式传参
利用read命令可以和脚本执行者进行交互传参
交互赋值单个变量
交互赋值多个变量
交互赋值数组
交互赋值并显示提示符
隐藏赋值内容
设置超时时间
设置赋值长度
指定录入结束符
变量脚本练习:
要求:
7.4 数组变量
我们可以定义变量为一组内容,中间的元素用空格隔开
取变量的所有元素
取数组的第一个元素
取数组的最后一个元素
取数组的第1-3个元素
查看数组的元素个数
管理数组元素
7.5.变量中字符串的取值管理
设定实验变量
取所有字符串
统计字符串长度
从指定位置取值到结尾
从指定位置取指定长度的字符
从倒数第3个字符向后取2个字符
取最后5个字符
从开头检索最近匹配字符串并删除
从开头检索最远匹配字符串并删除
替换字符
取后缀
7.6.脚本中的函数
变量是一个变化值的别名
函数就是一段程序的别名
函数循环,一直执行
当一个值等于什么,直接退出
脚本练习
8.取消变量
unset 变量 即可把变量取消
如果变量被记录到配置文件中需要在配置文件中删除记录
二.shell中的运算
2.1.shell中的运算命令
[root@lee ~]# echo a=((1 + 2))
[root@lee ~]# echo $a
3
[root@lee ~]# let a=1+2
[root@lee ~]# echo $a
3
[root@lee ~]# expr 1 \* 2
2
[root@lee ~]# echo "scale=2;1/2" | bc
.50
[root@lee ~]# echo "obase=2;ibase=10;2"|bc
10
[root@lee ~]# echo $[1+1]
2
[root@lee ~]# awk 'BEGIN{print 1.88/29}'
0.0648276
[root@lee ~]# declare -i a=1+1
[root@lee ~]# echo $a
2
2.2.shell中的数学运算符号
shell中常用的运算符号如下
加等
脚本练习:
需要1分10秒倒计时:
2.3.位运算
2.3.1.什么是位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的位运算就是直接对整数在内存中的二进制位进行操作