变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
用来存放系统和用户需要使用的特定参数
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
①定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)
②定义变量时,变量名要求:
变量名区分大小写建议全部使用大写,不能使用系统内置变量。如$PATH是系统外部命令的存放路径等。
变量名不能以数字开头,且不支持短横线 -。
变量命名要求
区分大小写
不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
大驼峰 StudentFirstName
小驼峰 studentFirstName
下划线 student_name
1、自定义变量:由用户自己定义,修改和使用
2、预定义变量:Bash中内置的一类变量 ? ?shell ? ? ? ? 不能修改 ? ?规定好的变量 放在那里让你使用
3、环境变量:由系统维护,用于设置工作环境 ?
4、只读变量:只可以读取不可以更改 ?
变量值不允许修改(重新赋值)的情况,无法使用 unset删除,最快方法重启
5、位置变量:通过命令行给脚本传递参数
6、系统内置变量:PATH,UID,HOSTNAME,USER
定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)
变量名以字母或者下划线开头,区分大小写,建议全大写,长度不超过20个。
echo $变量名
unset? ?变量名
变量名+=追加值
自定义变量
方式一:变量名=变量值
方式二:交互的方式去定义变量
5.? ? read -p? ? ? 从键盘输入的内容变成变量
? ? ? ? ? ? ? ? ? ? (?交互的方式去定义变量)
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用。
方法:
格式1:export 变量名
格式2:export 变量名=变量值
可以使用pstree 查看shell的环境,输入bash进入子shell,ctrl+D组合exit 退出子shell
新定义的变量加export ,设为全局变量,在所有的子shell环境中都可以继续使用
expr? ? ? 只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 ?+
减法 -
乘法 ?\ *
除法 ?/
取余 (取模)%?
实验1:
实验2:
let var=算术表达式
let sum=1+2
sum=1+2
实验3:
((var=算术表达式)) 和上面等价
((sum=1+2))
echo $sum
实验4:
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"
~
由系统提前创建,用来设置用户的工作环境
可以使用env查看环境变量
需要记住的常用环境变量
环境变量:
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
配置文件位置在? ?/etc/profile? 如果修改此文件会作用于所有用户
~/.bash_profile ?用户独立的配置文件,修改这个文件只作用于当前用户
可以用来长期变更或设置环境变量
切到opt文件夹下去做,这里忘记切换了,或者data都可以
相当与opt 就是一个环境变量了
变量值不允许修改(重新赋值)的情况,无法使用 unset删除,最快方法重启
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
bash ? 帮你定义好了 ?拿来用就可以了,你不需要知道为什么,记住
?$*? ?表示所有位置参数的内容看成一个整体返回 ? ? ?返回所有 ? ? ? ? ?
$@??表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 ? 返回所有 ?
$?? ?表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#? 表示命令行中位置参数的总个数
$0? 表示当前执行的脚本或程序的名称 ? ? 当前脚本的名字
$$? 当前bash的进程id ? ?
$!? ?后台任务最后一个id
$?? ?表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#? 表示命令行中位置参数的总个数
$0? 表示当前执行的脚本或程序的名称 ? ? 当前脚本的名字
$@ 与 $*
格式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
条件测试命令
[ 整数1 -操作符 整数2 ] 公式
-eq:第一个数等于(Equal)第二个数
-ne:第一个数不等于(Not Equal)第二个数
-gt:第一个数大于(Greater Than)第二个数
-lt:第一个数小于(Lesser Than)第二个数
-le:第一个数小于或等于(Lesser or Equal)第二个数
-ge:第一个数大于或等于(Greater or Equal)第二个数
实验:
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符是否存在
格式
[ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
格式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 标题 发送方
[[ 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