14、变量和引用

RHCE板块

欢迎来到我的博客,这里是Linux板块,配合之前RHCSA进阶,希望我的博客可以帮助到您,感谢您的阅读,有什么问题还希望一起探讨交流,感谢各位的支持,感谢!

  1. 使用Linux搭建一个简单的论坛
  2. RHCE——一、安装部署及例行性工作
  3. RHCE——二、时间服务器
  4. RHCE——三、远程连接服务器
  5. RHCE——四、Web服务器(理论篇
  6. RHCE——五、Web服务器及内网穿透(实验篇
  7. RHCE——六、基于https协议的静态网站
  8. RHCE——七、搭建云存储器
  9. RHCE——八、DNS域名解析服务器
  10. RHCE——九、SELinux
  11. RHCE——十、防火墙、iptables、firewalld
  12. RHCE——十一、NFS服务器
  13. RHCE——十二、Mysql服务
  14. RHCE——十三、Shell自动化运维编程基础
  15. RHCE——十四、变量和引用
  16. RHCE——十五、shell条件测试
  17. RHCE——十六、流程控制之条件判断、循环
  18. RHCE——十七、文本搜索工具-grep、正则表达式
  19. RHCE——十八、shell编程之sed
  20. RHCE——十九、shell编程之awk
  21. RHCE——二十、Ansible及安装与配置
  22. RHCE——二十一、Ansible模块

一、深入认识变量

1、什么是变量

  • 变量是在程序中保存用户数据的一段内存存储空间,变量名是内存空间的首地址

2、变量的名称

  • 组成:字母、数字、下划线组成,不能以数字开头
  • 变量名称的长度,shell没有明确规定,但是为了增加可读性,建议使用较短的、见名知意的名称命名
  • 规则
    • 首字符必须为字母:a-z,A-Z
    • 中间不能由空格,可以使用下划线(_)
    • 不能使用标点符号
    • 不能使用bash中关键字,输入help查看bash的保留字
    • 例:下面的变量名都是很好的选择
[root@server ~]# JAVA_HOME=/usr/bin/jvm/jre-1.6.0-openjdk.x86_64
[root@server ~]# SUM=0
[root@server ~]# back_up=/root

3、变量的类型

  • 原则:shell是一种动态类型语言和弱类型语言,变量是不分数据类型的,统一都使用字符串存储,但根据变量的上下文环境,允许程序执行一些不同的操作,如:比较、整数加减
  • shell的变量数据类型
[root@server /]# vim  test1.sh
x=123
let x+=1
echo  "x=$x"

在这里插入图片描述

4、变量的定义

  • 原则:直接使用,不需要变量声明
  • 格式:变量名=变量的值
  • 例:
[root@server /]# vim  test2.sh
a=1
b="hello"
c="hello  world"   #(中间的如果有空格,必须加双引号)
bak_dir=/mnt
  • = 前后不能收空格
[root@server ~]# a= 3
bash: 3: command not found...
[root@server ~]# b =5
bash: b: command not found...
  • 字符串类型建议使用双引好作为定界符引起,尤其是字符串中有空格
[root@server ~]# stu_name=zhang san
bash: san: command not found...
[root@server ~]# stu_name="zhang san"
[root@server ~]# stu_name='zhang san'

5、自定义变量

  • 概念:上述以赋值形态形成的变量定义形式称为自定义变量
  • 引用变量的值:
    • $变量名
    • ${表达式或变量名}
[root@server ~]# a=1024
[root@server ~]# echo  $a
[root@server ~]# echo  ${a}
  • 查看变量(自定义变量和全局变量)
[root@server ~]# set | more
[root@server ~]# declare | more

6、环境变量

  • 环境变量又称为全局变量,可以在任意子shell生效,环境变量又分为自定义环境变量和bash内置的环境变量,用户退出命令后改变量会丢失,若需要永久保存就必须写在配置文件中
  • 定义环境变量
  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
# 法1
[root@server /]# export  环境变量=值

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

# 法2
[root@server /]# 变量名=值
[root@server /]# export  变量名
# 法3
[root@server /]# declare  -x   变量名=值
  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  • 例:
[root@server /]# export  back_dir1=/home/fox
[root@server /]# 
[root@server /]# NAME=zhangsan
[root@server /]# export  NAME
[root@server /]# 
[root@server /]# declare  -x  AGE=20
[root@server /]# 
[root@server /]# env         # 查看当前root用户的环境变量
[root@server /]# printenv    # 同上
[root@server /]# export      # 同上

在这里插入图片描述

  • 注意:以上定义的环境变量都是临时的,重启后会失效,若要永久生效,则需要写入到配置文件中
  • 对比:
C语言      局部变量      全局变量
shell     自定义变量     环境变量
  • shell 环境变量存储的文件:
    • bash shell 初始化文件有:/etc/profile、 ~/.bash_profile、 ~/.bash_login、 ~/.profile、 ~/.bashrc、/etc/bashrc
    • 如图:
    • image-20230130154156590
    • /etc/profile :存放一些全局(共有)变量,不管哪个用户,登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等
    • ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件
    • ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取
    • /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取
    • /etc/inputrc文件为特定的情况处理键盘映射
    • 执行顺序:/etc/profile–>/etc/profile.d/*.sh–> ~/.bash_profile -->/etc/bashrc–>~./.bashrc
    • 结论:
      • 对于用户的环境变量设置,常见的是用户家目录下的.bashrc和.bash_profile
      • 对于全局环境变量设置,常见的文件有:/etc/profile /etc/bashrc /etc/profile.d 这三个配置文件,常用方法是直接在/etc/profile文件中写入全局变量,如果想要在登陆后初始化或者显示加载的内容,只需要把脚本文件放在 /etc/profile.d 文件下即可

7、位置变量

  • 概念:当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置变量来表示该参数
[root@server /]# bash  test1.sh  hello  world  123  456
  • 当执行test1.sh 脚本时,第一个参数为hello到第四个参数可以使用特殊的符号表示,如:$1 $2 $3 ……

  • 常见的位置变量

$0 : 脚本名
$1-$9 : 1-9个参数
${10} :10以上的参数需要大花括号括起
$* : 所有参数
$@ : 所有参数
$# : 参数个数
$$ : 当前进程的PID
$! : 上一个后台进程的PID
$? : 上一个命令的返回值状态码,0为成功
  • 例:
[root@server /]# vim  test3.sh
#!/bin/bash
echo  "第2个位置参数是: $2"
echo  "第1个位置参数是: $1"
echo  "第4个位置参数是: $4"
echo  "所有参数是: $*"    "1 2 3 4 5"
echo  "所有参数是: $@"    "1" "2" "3" "4" "5"
echo  "参数个数是: $#"
echo  "当前脚本的进程PID值: $$"
echo  "当前脚本的文件名: $0"
[root@server /]# bash test3.sh 1 2 3 4 5
第2个位置参数是: 2
第1个位置参数是: 1
第4个位置参数是: 4
所有参数是: 1 2 3 4 5
所有参数是: 1 2 3 4 5
参数个数是: 5
当前脚本的进程PID值: 2378
当前脚本的文件名: test3.sh
[root@server /]# bash test3.sh  a b c d e f g
第2个位置参数是: b
第1个位置参数是: a
第4个位置参数是: d
所有参数是: a b c d e f g
所有参数是: a b c d e f g
参数个数是: 7
当前脚本的进程PID值: 2379
当前脚本的文件名: test3.sh

在这里插入图片描述

  • $* 与 $@区别
$* 和 $ @没有被引用的时候,它们确实没有什么区别,都会把位置参数当成一个个体, "$*"会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"$* "为空,如果有两个位置参数并且IFS为空格时,"$*"相当于"$1 $2"
"$@"会把所有位置参数当成一个单独的字段,如果没有位置参数($#为0),则"$@"展开为空(不是空字符串,而是空列表),如果存在一个位置参数,则"$@"相当于"$1",如果有两个参数,则"$@"相当于"$1" "$2"等等

二、变量赋值和作用域

1、显示赋值:变量名=变量值

[root@server /]# ip1=192.168.48.131
[root@server /]# school="Peking University"
[root@server /]# today1=`date +%F`  # 反引号
[root@server /]# today2=$(date +%F)

[root@server /]# echo $ip1
[root@server /]# echo $school
[root@server /]# echo $today1
[root@server /]# echo $today2

在这里插入图片描述

2、read 从键盘读入变量值

  • read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

  • 格式:read -参数 变量名

  • 参数

    • -p “提示语句:” 屏幕打印出一行提示语句。
    • -n数字:当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量,如:-n1 , 只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键
    • -t 等待时间 :计时输入,使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。-t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态
    • -s : 关闭回显,使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)
    • 常用格式:
[root@server /]# read  变量名
[root@server /]# read  -p  "提示信息:"   变量名
  • 例:
[root@server ~]# read  -p  "enter  numbers: " num
enter  numbers: 123
[root@server ~]# echo $num
123
[root@server ~]# read -t 3 n1  # 等待3秒未输入则结束输入
[root@server ~]# read -s -p  "enter  your password: " psd
enter  your password: [root@server ~]# 
[root@server ~]# echo  $REPLY
[root@server ~]# read
200
[root@server ~]# echo  $REPLY  # 当输入时没有变量接收则会存储到环境变量REPLY200
[root@server ~]# read  t1  t2  # 一次输入多个数据
12  35
[root@server ~]# echo  $t1  $t2
12 35

3、变量和引号

  • 双引号:除了$ 、单引号、反引号、反斜线之外,其它被引起的内容保持字面意思
  • 单引号:所有字符保持字面意思
  • 反引号:被引起的字符串转为shell命令
  • 反斜线:转义符(\),屏蔽后面字符的特殊含义

在这里插入图片描述

4、变量的作用域

  • 全局变量:全局变量定义在脚本中,也可以定义在函数中,作用范围:从定义的开始处到shell脚本结束或者被显示的去除

  • 例:

[root@server ~]# vim  test5.sh
#!/bin/bash
func()   # 定义函数
{
        echo   "$v1"
        v1=200
}
v1=100
func
echo  "$v1"
[root@server ~]# bash  test5.sh 
100
200
  • 函数内部定义全局变量
# 上例修改
[root@server ~]# vim  test5.sh
#!/bin/bash
func()   # 定义函数
{
        v2=200
}
func
echo  "$v2"
[root@server ~]# bash  test5.sh 
200
  • 局部变量:范围更小,仅限于某个程序段中,如:函数、shell等,通过local关键字定义,注意:函数的参数也是局部变量
# 上例修改
[root@server ~]# vim  test5.sh
#!/bin/bash
func()   # 定义函数
{
        local v3=200  # 使用local关键字声明为局部变量
}
func
echo  "$v3"
[root@server ~]# bash  test5.sh 
  • 全局变量和局部变量区别
# 上例修改
[root@server ~]# vim  test5.sh
#!/bin/bash
func()
{
        #输出全局变量v1的值
        echo "global variable v1 is $v1"
        #定义局部变量v1
        local v1=2
        #输出局部变量v1的值
        echo "local variable v1 is $v1"
}
#定义全局变量v1
v1=1
#调用函数
func
#输出全局变量v1的值
echo "global variable v1 is $v1"

5、变量的运算

  • 运算符与命令

image-20230131145637145

  • 例1
[root@server ~]# expr  1 + 1   # 运算符左右要有空格
2
[root@server ~]# expr  1+1
1+1
[root@server ~]# a=1
[root@server ~]# b=2
[root@server ~]# expr  $a + $b
3
[root@server ~]# expr  a + b
expr: 非整数参数
[root@server ~]# echo  $((1+2))
3
[root@server ~]# echo  $((a+b))
3
[root@server ~]# $((1+2))       # expr等价与echo+(())
bash: 3: command not found...
[root@server ~]# echo  $((1+2))
3
[root@server ~]# echo  $((5/2))
2
[root@server ~]# echo  $((5%3))
2
[root@server ~]# echo  $((3%5))
3
[root@server ~]# echo  $((50%30))
20
[root@server ~]# echo  $((1-5))
-4
[root@server ~]# echo  $((2,5+5))
10 
[root@server ~]# echo  $((2.5+5))  # (())不支持小数
-bash: 2.5+5:语法错误: 无效的算术运算符 (错误符号是 ".5+5")
[root@server ~]# echo  $[2+5]
7
[root@server ~]# echo  $[2.5+5]
-bash: 2.5+5:语法错误: 无效的算术运算符 (错误符号是 ".5+5")
[root@server ~]# bc   # bc计算器
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1+2
3
2-5
-3
5/2
2
1.5+3.6
5.1
5>3
1
3>5
0
quit   # 退出交互模式

在这里插入图片描述

例2:

[root@server ~]# str1="hello world"
[root@server ~]# echo  ${#str1}        # 计算变量的串长度
11
# 变量值截取
[root@server ~]# echo  ${str1:0:3}  # 从左边第一个字符开始截取3个字符
hel
[root@server ~]# echo  ${str1::3}  # 同上,0可以省略
hel
[root@server ~]# echo  ${str1:1}  # 从下标1字符开始截取到尾部
ello world
[root@server ~]# echo  ${str1:0-1:1} # 从右侧第一个字符开始截取1个,左边为0,右边为0-1  0-2  等
d
[root@server ~]# echo  ${str1:0-2:1}
l
[root@server ~]# echo  ${str1:0-5}  # 从右侧数第5个字符截取到尾部
[root@server ~]# echo  ${str1: -5}  # 使用空格替代0
world
[root@server ~]# echo  ${str1:-5}  # 无空格提取整串
hello world

在这里插入图片描述

# 使用%截取字符串,含义:删除右边字符,保留左边字符
[root@server ~]# filename=testfile.tar
# %. 表示从右边开始检索第一次出现的点 , 检索到后删除右侧,保留左侧
[root@server ~]# file=${filename%.*}  
[root@server ~]# echo  $file
testfile
# 作用:保留左边内容,用于截取文件的主文件名,去掉扩展名
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url%%:*} # %%表示从右向左检索最后一次出现的冒号,删除右侧保留左侧内容
[root@server ~]# echo  $ul1
http
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url#*.} #  #*.表示左向右检索第一次出现的点,删除左边,保留右边 
[root@server ~]# echo  $ul1
baidu.com/index.html
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url%/*} #  %/* 表示从右向左检索第一次出现的/删除右侧保留左侧
[root@server ~]# echo  $ul1
http://www.baidu.com
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url##*/} #  ##*/ 表示左向右检索最有一次出现的/删除左边保留右边
[root@server ~]# echo  $ul1
index.html

#总结:不管哪种检索方向,检索过的都删掉

server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url#.} # #.表示左向右检索第一次出现的点,删除左边,保留右边
[root@server ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 41: …[root@server ~]#̲ url=http://www…{url%/} # %/ 表示从右向左检索第一次出现的/删除右侧保留左侧
[root@server ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 41: …[root@server ~]#̲ url=http://www…{url##/} # ##/ 表示左向右检索最有一次出现的/删除左边保留右边
[root@server ~]# echo $ul1
index.html

#总结:不管哪种检索方向,检索过的都删掉

![在这里插入图片描述](https://img-blog.csdnimg.cn/0095e9e83d8845dcab8079250351f083.png)
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。
[入门数据分析的第一堂课]这是一门为数据分析小白量身打造的课程,你从网络或者公众号收集到很多关于数据分析的知识,但是它们零散不成体系,所以第一堂课首要目标是为你介绍:Ø  什么是数据分析-知其然才知其所以然Ø  为什么要学数据分析-有目标才有动力Ø  数据分析的学习路线-有方向走得更快Ø  数据分析的模型-分析之道,快速形成分析思路Ø  应用案例及场景-分析之术,掌握分析方法[哪些同学适合学习这门课程]想要转行做数据分析师的,零基础亦可工作中需要数据分析技能的,例如运营、产品等对数据分析感兴趣,想要更多了解的[你的收获]n  会为你介绍数据分析的基本情况,为你展现数据分析的全貌。让你清楚知道自己该如何在数据分析地图上行走n  会为你介绍数据分析的分析方法和模型。这部分是讲数据分析的道,只有学会底层逻辑,能够在面对问题时有自己的想法,才能够下一步采取行动n  会为你介绍数据分析的数据处理和常用分析方法。这篇是讲数据分析的术,先有道,后而用术来实现你的想法,得出最终的结论。n  会为你介绍数据分析的应用。学到这里,你对数据分析已经有了初步的认识,并通过一些案例为你展现真实的应用。[专享增值服务]1:一对一答疑         关于课程问题可以通过微信直接询问老师,获得老师的一对一答疑2:转行问题解答         在转行的过程中的相关问题都可以询问老师,可获得一对一咨询机会3:打包资料分享         15本数据分析相关的电子书,一次获得终身学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值