目录
一、Shell脚本变量简介
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
1、变量的作用
用来存放系统和用户需要使用的特定参数
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
2、变量名要求
①定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)
②定义变量时,变量名要求:
变量名区分大小写建议全部使用大写,不能使用系统内置变量。如$PATH是系统外部命令的存放路径等。
变量名不能以数字开头,且不支持短横线 -。
变量命名要求
区分大小写
不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
大驼峰 StudentFirstName
小驼峰 studentFirstName
下划线 student_name
3.常见 Shell 变量的类型包括:
1、自定义变量:由用户自己定义,修改和使用
2、预定义变量:Bash中内置的一类变量 shell 不能修改 规定好的变量 放在那里让你使用
3、环境变量:由系统维护,用于设置工作环境
4、只读变量:只可以读取不可以更改
变量值不允许修改(重新赋值)的情况,无法使用 unset删除,最快方法重启
5、位置变量:通过命令行给脚本传递参数
6、系统内置变量:PATH,UID,HOSTNAME,USER
1、自定义变量:
1.自定义变量
定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)
变量名以字母或者下划线开头,区分大小写,建议全大写,长度不超过20个。
2.调用变量
echo $变量名
3.删除变量
unset 变量名
4.变量追加值
变量名+=追加值
自定义变量
方式一:变量名=变量值
方式二:交互的方式去定义变量
5. read -p 从键盘输入的内容变成变量
( 交互的方式去定义变量)
2.设置变量作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用。
方法:
-
格式1:export 变量名
-
格式2:export 变量名=变量值
可以使用pstree 查看shell的环境,输入bash进入子shell,ctrl+D组合exit 退出子shell
新定义的变量加export ,设为全局变量,在所有的子shell环境中都可以继续使用
3.整数的运算
expr 只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
①
②
let var=算术表达式
let sum=1+2
sum=1+2
③
((var=算术表达式)) 和上面等价
((sum=1+2))
echo $sum
④
var= $[算术表达式]
计算方式随你挑哈
也可以这样:
随机数生成器变量:
$RANDOM 取值范围:0-32767
[root@localhost ~]#man bash
$[RANDOM%33+1]
[root@localhost ~]# echo $[RANDOM%34+1]
9
[root@localhost ~]#echo -e "\E[1;30mhello\E[0m"
#颜色
[root@localhost ~]# echo -e "\E[1;$[RANDOM%7+31]mhello\E[0m"
#随机颜色
[root@localhost ~]#echo $(expr $RANDOM % 33 + 1)
#注意运算符附近都要有空格
[root@localhost ~]# echo $[RANDOM%3] 它的范围是0到2
[root@localhost ~]# echo $[RANDOM%3+1]
颜色 [root@localhost ~]#echo -e "\E[1;30mhello\E[0m"
我们来提取下系统信息
#!/bin/bash
host=`ifconfig ens33|grep netmask|tr -s " "|cut -d" " -f3`
name=`hostname`
cpu=`lscpu|grep 型号名称|tr -s " "|cut -d" " -f2-8`
ke=`uname -r`
os=`cat /etc/redhat-release`
disk=`lsblk |grep disk|tr -s " " |cut -d" " -f4`
mem=`free -h|grep Mem|awk '{print $2}'`
echo -e "\E[1;32m--------------------system info-------------------------\E[0m"
echo "主机名: $name"
echo "IP地址: $host"
echo "cpu型号: $cpu"
echo "内核版本: $ke"
echo "系统类型: $os"
echo "磁盘大小: $disk"
echo "内存大小: $mem"
echo -e "\E[1;32m-----------------------end---------------------------------\E[0m"
提取信息:
编辑脚本:
注意格式,空格,冒号
英文版提取系统信息
#!/bin/bash
RED="\E[1;31m"
GREEN="\E[1;32m"
END="\E[0m"
echo -e "$GREEN----------------------Host systeminfo--------------------$END"
echo -e "HOSTNAME: $RED`hostname`$END"
echo -e "IPADDR: $RED` ifconfig ens33|grep -Eo '([0-9]{1,3}\.){3}[0-9]
{1,3}' |head -n1`$END"
echo -e "OSVERSION: $RED`cat /etc/redhat-release`$END"
echo -e "KERNEL: $RED`uname -r`$END"
echo -e "CPU: $RED`lscpu|grep '型号名称:'|tr -s ' '|cut -d : -f2`$END"
echo -e "MEMORY: $RED`free -h|grep Mem|tr -s ' ' : |cut -d : -f2`$END"
echo -e "DISK: $RED`lsblk |grep '^sd' |tr -s ' ' |cut -d " " -f4`$END"
echo -e "$GREEN---------------------------------------------------------$END"
~
4.环境变量
环境变量:
-
由系统提前创建,用来设置用户的工作环境
-
可以使用env查看环境变量
-
需要记住的常用环境变量
环境变量:
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
环境变量的全局配置文件:
配置文件位置在 /etc/profile 如果修改此文件会作用于所有用户
~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户
可以用来长期变更或设置环境变量
切到opt文件夹下去做,这里忘记切换了,或者data都可以
相当与opt 就是一个环境变量了
补充:
这四个文件的优先级跟你放到那个位置有关系,是文件开头还是结尾或其他地方
5.只读变量
变量值不允许修改(重新赋值)的情况,无法使用 unset删除,最快方法重启
6.位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
7.预定义(状态)变量
bash 帮你定义好了 拿来用就可以了,你不需要知道为什么,记住
$* 表示所有位置参数的内容看成一个整体返回 返回所有
$@ 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
$? 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$# 表示命令行中位置参数的总个数
$0 表示当前执行的脚本或程序的名称 当前脚本的名字
$$ 当前bash的进程id
$! 后台任务最后一个id
$? 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$# 表示命令行中位置参数的总个数
$0 表示当前执行的脚本或程序的名称 当前脚本的名字
$@ 与 $*
二、条件语句
测试:
1. () {}
2.test 测试文件的表达式 是否成立
格式1:test 条件表达式
格式2:[ 条件表达式 ]
注意[ ]空格,否则会失败
测试 是否成功使用 $? 返回值
[ 操作符 文件或目录 ]
help test
操作符:
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
![]()
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-L: 测试是否为软连接文件
属性测试补充:
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成
测试过程,实现评估布尔声明,以便用在条件性环境下进行执行
若真,则状态码变量 $? 返回0
若假,则状态码变量 $? 返回1
条件测试命令
3.比较整数数值
[ 整数1 -操作符 整数2 ] 公式
-
-eq:第一个数等于(Equal)第二个数
-
-ne:第一个数不等于(Not Equal)第二个数
-
-gt:第一个数大于(Greater Than)第二个数
-
-lt:第一个数小于(Lesser Than)第二个数
-
-le:第一个数小于或等于(Lesser or Equal)第二个数
-
-ge:第一个数大于或等于(Greater or Equal)第二个数
提取目标数字,定义变量,判断
4.字符串比较
常用的测试操作符
-
=:字符串内容相同
-
!=:字符串内容不同,! 号表示相反的意思
-
-z:字符串内容为空
-
-n: 字符是否存在
格式
[ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
5.逻辑测试(短路运算)
格式1∶ [ 表达式1 ] 操作符 [ 表达式2 ]…
格式2∶ 命令1 操作符 命令2…
常见条件
-a或&&:逻辑与,“而且”的意思全真才为真
-o或||:逻辑或,“或者”的意思一真即为真
!:逻辑否
操作符:
&&或-a 表示且的意思,前面表达式或命令1为真才会执行操作符后面的表达式2或命令2。一假则为假。
||或-o 表示或的意思,前面表达式1或命令1为真则整个表达式为真,前面表达式为假或命令为假才会执行后面的表达式2或命令2 。一真则为真。
例如:
如果你不想放到垃圾邮箱
#会给你一串密码:比如 zqvvpycmrhoubefa
[root@localhost ~]#vim /etc/mail.rc
#将已下段加入到邮箱中
set from=940132245@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=940132245@qq.com
set smtp-auth-password=zqvvpycmrhoubefa
[root@localhost ~]# echo "hello wolrd" |mail -s test 360601212@qq.com
# 你要发送的信息 | 使用邮件 -s 标题 发送方
6.双中括号
[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
#通配符
[root@centos8 ~]#FILE=test.log
[root@centos8 ~]#[[ "$FILE" == *.log ]]
[root@centos8 ~]#echo $?
0
[root@centos8 ~]#FILE=test.txt
[root@centos8 ~]#[[ "$FILE" == *.log ]]
[root@centos8 ~]#echo $?
1
[root@centos8 ~]#[[ "$FILE" != *.log ]]
[root@centos8 ~]#echo $?
0