Linux系统Shell脚本 ----- 变量 (二)

一、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.变量追加值

变量名+=追加值

Linux系统Shell脚本 ----- 变量 (二)_第1张图片

自定义变量

方式一:变量名=变量值

方式二:交互的方式去定义变量

5.    read -p      从键盘输入的内容变成变量
                    ( 交互的方式去定义变量)

Linux系统Shell脚本 ----- 变量 (二)_第2张图片

2.设置变量作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用

方法:

  1. 格式1:export 变量名

  2. 格式2:export 变量名=变量值

可以使用pstree 查看shell的环境,输入bash进入子shell,ctrl+D组合exit 退出子shell

新定义的变量加export ,设为全局变量,在所有的子shell环境中都可以继续使用

Linux系统Shell脚本 ----- 变量 (二)_第3张图片

3.整数的运算

expr      只能进行整数的运算

格式: expr 变量1 运算符 变量2 [运算符 变量3]

运算符:

加法  +

减法 -

乘法  \ *

除法  /

取余 (取模)% 

实验1:

Linux系统Shell脚本 ----- 变量 (二)_第4张图片

实验2:

let var=算术表达式
let sum=1+2
sum=1+2

Linux系统Shell脚本 ----- 变量 (二)_第5张图片

实验3:

 ((var=算术表达式)) 和上面等价
((sum=1+2))
echo $sum

实验4:

 var= $[算术表达式]

计算方式随你挑哈

Linux系统Shell脚本 ----- 变量 (二)_第6张图片

也可以这样:

Linux系统Shell脚本 ----- 变量 (二)_第7张图片

随机数生成器变量:

$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)
#注意运算符附近都要有空格

Linux系统Shell脚本 ----- 变量 (二)_第8张图片

[root@localhost ~]# echo $[RANDOM%3]     它的范围是0到2

Linux系统Shell脚本 ----- 变量 (二)_第9张图片

[root@localhost ~]# echo $[RANDOM%3+1] 

Linux系统Shell脚本 ----- 变量 (二)_第10张图片

颜色   [root@localhost ~]#echo -e "\E[1;30mhello\E[0m"  

Linux系统Shell脚本 ----- 变量 (二)_第11张图片

我们来提取下系统信息

#!/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"

提取信息:

Linux系统Shell脚本 ----- 变量 (二)_第12张图片

Linux系统Shell脚本 ----- 变量 (二)_第13张图片

编辑脚本:

注意格式,空格,冒号

Linux系统Shell脚本 ----- 变量 (二)_第14张图片

Linux系统Shell脚本 ----- 变量 (二)_第15张图片

英文版提取系统信息
#!/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.环境变量

环境变量:
  1. 由系统提前创建,用来设置用户的工作环境

  2. 可以使用env查看环境变量

  3. 需要记住的常用环境变量

环境变量:

可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用

Linux系统Shell脚本 ----- 变量 (二)_第16张图片

Linux系统Shell脚本 ----- 变量 (二)_第17张图片

Linux系统Shell脚本 ----- 变量 (二)_第18张图片

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

$PATH 表示可执行用户程序的默认路径

环境变量的全局配置文件:

配置文件位置在   /etc/profile  如果修改此文件会作用于所有用户

~/.bash_profile  用户独立的配置文件,修改这个文件只作用于当前用户

可以用来长期变更或设置环境变量

切到opt文件夹下去做,这里忘记切换了,或者data都可以

Linux系统Shell脚本 ----- 变量 (二)_第19张图片

Linux系统Shell脚本 ----- 变量 (二)_第20张图片相当与opt 就是一个环境变量了

补充:

这四个文件的优先级跟你放到那个位置有关系,是文件开头还是结尾或其他地方

Linux系统Shell脚本 ----- 变量 (二)_第21张图片

5.只读变量

变量值不允许修改(重新赋值)的情况,无法使用 unset删除,最快方法重启

Linux系统Shell脚本 ----- 变量 (二)_第22张图片

6.位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示Linux系统Shell脚本 ----- 变量 (二)_第23张图片

Linux系统Shell脚本 ----- 变量 (二)_第24张图片

7.预定义(状态)变量

bash   帮你定义好了  拿来用就可以了,你不需要知道为什么,记住

 $*   表示所有位置参数的内容看成一个整体返回      返回所有          
$@  表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回   返回所有  
$?   表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#  表示命令行中位置参数的总个数
$0  表示当前执行的脚本或程序的名称     当前脚本的名字
$$  当前bash的进程id    
$!   后台任务最后一个id

Linux系统Shell脚本 ----- 变量 (二)_第25张图片

Linux系统Shell脚本 ----- 变量 (二)_第26张图片

$?   表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

Linux系统Shell脚本 ----- 变量 (二)_第27张图片

$#  表示命令行中位置参数的总个数

Linux系统Shell脚本 ----- 变量 (二)_第28张图片

$0  表示当前执行的脚本或程序的名称     当前脚本的名字

Linux系统Shell脚本 ----- 变量 (二)_第29张图片

Linux系统Shell脚本 ----- 变量 (二)_第30张图片

$@ 与 $*

Linux系统Shell脚本 ----- 变量 (二)_第31张图片

Linux系统Shell脚本 ----- 变量 (二)_第32张图片

Linux系统Shell脚本 ----- 变量 (二)_第33张图片

二、条件语句

测试:

1. () {}

Linux系统Shell脚本 ----- 变量 (二)_第34张图片

2.test 测试文件的表达式 是否成立

格式1:test  条件表达式
格式2:[  条件表达式  ]


注意[ ]空格,否则会失败
测试 是否成功使用 $?  返回值
[ 操作符 文件或目录 ]
help test

操作符:
-d:测试是否为目录(Directory)


-e:测试目录或文件是否存在(Exist) 

Linux系统Shell脚本 ----- 变量 (二)_第35张图片 
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)

Linux系统Shell脚本 ----- 变量 (二)_第36张图片
-w:测试当前用户是否有权限写入(Write)

Linux系统Shell脚本 ----- 变量 (二)_第37张图片
-x:测试当前用户是否有权限执行(eXcute)

Linux系统Shell脚本 ----- 变量 (二)_第38张图片

Linux系统Shell脚本 ----- 变量 (二)_第39张图片
-L: 测试是否为软连接文件

Linux系统Shell脚本 ----- 变量 (二)_第40张图片

Linux系统Shell脚本 ----- 变量 (二)_第41张图片

Linux系统Shell脚本 ----- 变量 (二)_第42张图片

属性测试补充:
-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)第二个数

Linux系统Shell脚本 ----- 变量 (二)_第43张图片

实验:

Linux系统Shell脚本 ----- 变量 (二)_第44张图片

Linux系统Shell脚本 ----- 变量 (二)_第45张图片

4.字符串比较

常用的测试操作符

  • =:字符串内容相同

  • !=:字符串内容不同,! 号表示相反的意思

  • -z:字符串内容为空

  • -n: 字符是否存在

格式

[ 字符串1 = 字符串2 ] 是否相同

[ 字符串1 != 字符串2 ] 是否不相同

[ -z 字符串 ] 是否为空

[ -n 字符串 ] 字符是否存在

Linux系统Shell脚本 ----- 变量 (二)_第46张图片

Linux系统Shell脚本 ----- 变量 (二)_第47张图片

Linux系统Shell脚本 ----- 变量 (二)_第48张图片

5.逻辑测试(短路运算)

格式1∶	[ 表达式1 ] 操作符 [ 表达式2 ]…
格式2∶	命令1 操作符 命令2…

常见条件

  • -a或&&:逻辑与,“而且”的意思全真才为真

  • -o或||:逻辑或,“或者”的意思一真即为真

  • !:逻辑否

Linux系统Shell脚本 ----- 变量 (二)_第49张图片

操作符:

&&或-a  表示且的意思,前面表达式或命令1为真才会执行操作符后面的表达式2或命令2。一假则为假。

||或-o   表示或的意思,前面表达式1或命令1为真则整个表达式为真,前面表达式为假或命令为假才会执行后面的表达式2或命令2 。一真则为真。

例如:

Linux系统Shell脚本 ----- 变量 (二)_第50张图片

Linux系统Shell脚本 ----- 变量 (二)_第51张图片

实验:

Linux系统Shell脚本 ----- 变量 (二)_第52张图片

Linux系统Shell脚本 ----- 变量 (二)_第53张图片

Linux系统Shell脚本 ----- 变量 (二)_第54张图片

Linux系统Shell脚本 ----- 变量 (二)_第55张图片

Linux系统Shell脚本 ----- 变量 (二)_第56张图片

Linux系统Shell脚本 ----- 变量 (二)_第57张图片

Linux系统Shell脚本 ----- 变量 (二)_第58张图片

如果你不想放到垃圾邮箱

Linux系统Shell脚本 ----- 变量 (二)_第59张图片

Linux系统Shell脚本 ----- 变量 (二)_第60张图片

Linux系统Shell脚本 ----- 变量 (二)_第61张图片

#会给你一串密码:比如 zqvvpycmrhoubefa

[root@localhost ~]#vim /etc/mail.rc
#将已下段加入到邮箱中
set [email protected]
set smtp=smtp.qq.com
set [email protected]
set smtp-auth-password=zqvvpycmrhoubefa

[root@localhost ~]# echo "hello wolrd" |mail -s test [email protected]
#                         你要发送的信息 | 使用邮件 -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

Linux系统Shell脚本 ----- 变量 (二)_第62张图片

你可能感兴趣的:(chrome,前端,linux,服务器,运维)