RHCE——十四、变量和引用

news2024/10/7 18:20:14

RHCE

      • 一、深入认识变量
        • 1、什么是变量
        • 2、变量的名称
        • 3、变量的类型
        • 4、变量的定义
        • 5、自定义变量
        • 6、环境变量
        • 7、位置变量
      • 二、变量赋值和作用域
        • 1、显示赋值:变量名=变量值
        • 2、read 从键盘读入变量值
        • 3、变量和引号
        • 4、变量的作用域
        • 5、变量的运算

一、深入认识变量

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
export  环境变量=

在这里插入图片描述

# 法2
变量名=export  变量名
# 法3
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@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、位置变量

  • 概念:当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置变量来表示该参数
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)

在这里插入图片描述

2、read 从键盘读入变量值

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

  • 格式:read -参数 变量名

  • 参数

    • -p “提示语句:” 屏幕打印出一行提示语句。
    • -n数字:当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量,如:-n1 , 只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键
    • -t 等待时间 :计时输入,使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。-t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态
    • -s : 关闭回显,使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)
    • 常用格式:
read  变量名
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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/963140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程题四大算法思想(三)——贪心法:找零问题、背包问题、任务调度问题、活动选择问题、Prim算法

文章目录 贪心法找零问题(change-making problem)贪心算法要求基本思想适合求解问题的特征 背包问题0/1背包问题0/1背包问题——贪心法 分数背包问题 任务调度问题活动选择问题活动选择——贪心法最早结束时间优先——最优性证明 Prim算法 贪心法 我在当…

【Electron将HTML项目打包成桌面应用exe文件】

目标:前端将静态页面文件夹所有页面打包成一个exe文件(不包含其它文件)可运行。 步骤 1、初始化 npm init此时项目多出一个package.json文件。 {"name": "my-electron-app","version": "1.0.0",…

前端面试中Vue的有经典面试题二

7. Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: 点击button会发现, obj.b 已经成功添加,但是视图并未刷新: 原因在于在Vue实例创建时, obj.b 并未声明,因…

【多线程案例】单例模式(懒汉模式和饿汉模式)

文章目录 1. 什么是单例模式?2. 立即加载/“饿汉模式”3. 延时加载/“懒汉模式”3.1 第一版3.2 第二版3.3 第三版3.4 第四版 1. 什么是单例模式? 提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊…

无涯教程-JavaScript - HYPGEOMDIST函数

HYPGEOMDIST函数替代Excel 2010中的HYPGEOM.DIST函数。 描述 该函数返回超几何分布。 HYPGEOMDIST返回给定样本数量,给定样本数量,总体成功率和总体数量的概率。 将HYPGEOMDIST用于具有有限总体的问题,其中每个观察输出都是成功或失败,并且给定大小的每个子集的选择可能性均…

《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存

《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存 本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为了方…

小兔鲜商02

npm i vueuse/core -fvue插件使用: 许多公用的全局组件,,可以通过插件注册进去,就不用一个一个导入组件,, import XtxSkeleton from /components/library/xtx-skeletonexport default {install (app) {// …

ELK高级搜索(三)

文章目录 11.索引Index入门11.1 索引管理11.2 定制分词器11.3 type底层结构11.4 定制dynamic mapping11.5 零停机重建索引 12.中文分词器 IK分词器12.1 Ik分词器安装使用12.2 ik配置文件12.3 使用mysql热更新 13.java api 实现索引管理14&…

Spring源码解析-总览

1、前言 Spring源码一直贯穿我们Java的开发中,只要你是一个Java开发人员就一定知道Spring全家桶。Spring全家桶为我们一共一站式服务,IOC、AOP更是Spring显著特性。但是Spring到底怎么为我们提供容器,管理资源的呢?下来&#xff0…

1.4状态机模型

状态机简介: 1.大盗阿福 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N N N家店铺,每家店中都有一些现金。 阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时&#xff0…

js对中文进行base64编码和解码操作,解决中文乱码问题

我使用github api的接口获取文件内容,然后使用atob进行解码,但是发现:乱码.......糟心啊 所以就有了我封装的方法: export const encode64 (str) > {// 首先,我们使用 encodeURIComponent 来获得百分比编码的UTF…

m1芯片macOS系统卡顿问题解决方法

m1芯片的MacBook在使用过程中会出现“假死”的情况。主要表现为鼠标转圈圈,很多操作都不能实现,不能输入文本,系统ui也响应十分慢,而资源监视却看不到很高的占用。一般出现此类情况只能关机或重启。这其中的"罪魁祸首"便…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——形式逻辑——联言选言假言——矛盾

角度 角度——汇总——持续优化 性质 (1) 所有的 S 是 P 所有的S是P 所有的S是P 与 有的 S 不是 P 有的S不是P 有的S不是P矛盾 (2) 所有的 S 不是 P 所有的S不是P 所有的S不是P 与 有的 S 是 P 有的S是P 有的S是P 矛盾 &#xf…

Spring源码解析(十):spring整合mybatis源码

Spring源码系列文章 Spring源码解析(一):环境搭建 Spring源码解析(二):bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三):bean容器的刷新 Spring源码解析(四):单例bean的创建流程 Spring源码解析(五)&…

计算机毕设之基于数据可视化的智慧社区内网平台python+django+mysql(含开题+源码+部署教程)

系统阐述的是一款基于数据可视化的智慧社区内网平台的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系…

el表达式和标签库的简单使用!!!

备工作1:tomcat10.1.13版本,可去官网下载,不会下载的童靴看过来:如何正确下载tomcat???_明天更新的博客-CSDN博客 准备工作2:添加架包(需要三个架包) jstl架包…

老师们快看过来,这里有使用ChatGPT当助教的方法

最近OpenAI官方博客发布了一篇文章How teachers are using ChatGPT(老师们如何使用ChatGPT),讲的是老师们如何在教学中使用ChatGPT,其中有几个例子挺好的,我转述一下,希望对你有用。 制定教案 第一个例子…

[git]分支操作

Checkout 相当于切换到该分支,但是因为不能直接操作远程分支,会在本地同步一个完全一样的分支。 注意:切换分支前本地先进行提交(addcommit),否则有可能代码会丢失。 New Branch from Selected... 创建一…

【小沐学Unity3d】3ds Max 多维子材质编辑(Multi/Sub-object)

文章目录 1、简介2、精简材质编辑器2.1 先创建多维子材质,后指定它2.2 先指定标准材质,后自动创建多维子材质 3、Slate材质编辑器3.1 编辑器简介3.2 编辑器使用 结语 1、简介 多维子材质(Multi/Sub-object)是为一个模形&#xff0…

信息安全检测和应用信息系统安全测试

安全测试 信息安全检测,为软件/信息系统出具的软件检测报告(或第三方检测报告、软件安全测试报告),是信息系统/软件上线前都需要的测试报告。 信息安全检测的标准: 信息安全检测依据DB31/T272-2008《计算机信息系统…