SHELL之变量

一、脚本
1、shell组成

#!脚本声明(使用哪种解释器)
#  注释信息
脚本内容

注意: 如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用:

#!/bin/env 解释器 
#!/bin/env bash

2、执行脚本方式

sh  -x  脚本文件路径
source  脚本文件路径
.       脚本文件绝对路径

二、变量
1、什么是变量

  • 变量:内存空间,命名的内存空间
  • 内存:编址的存储单元
  • 进程:程序执行起来成为进程,进程的数据存储在内存当中,进程执行过程中需要临时存储数据需要变量。
eg:
1、计算机计算1+100
在内存中分出100个空间存储100个整数,让运算器挨个取它加起来。
2、计算机计算1+100万
对一个内存空间设为变量,它会一直变化。

2、引用变量值

$变量名

3、查看变量名

echo $变量名
echo ${变量名}

4、取消变量名

unset 变量名

5、变量的类型
按存储类型:决定数据存储的格式和长度。

  • 整数型
  • 浮点型
  • 字符型
  • 双精度浮点型

按使用类型:

  • 环境变量:变量名通常都大小写,由系统维护,用来设置工作环境,只有个别变量用户可以直接更改
  • 位置变量:bash内置,存储执行脚本时提供的参数
  • 预定义变量:bash内置,一类有特殊用途的变量,可直接调用,但不能直接赋值或修改
  • 自定义变量(本地变量):由用户自主设置、修改及使用

三、变量详解

1、环境变量
1)按生效的范围分类。

  • 系统环境变量:公共的,对全部的用户都生效。
  • 用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

2)按生存周期分类。

  • 永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
  • 临时环境变量:使用时在Shell中临时定义,退出Shell后失效。

永久生效:

配置文件:/etc/profile、 ~/.bash_profile

相关操作:

env:列出当前用户所有的环境变量
set:列出当前用户所有变量
export:变量名=变量值 或者 变量名=变量值;export 变量名

常见的环境变量:

PWD、PATH、USER、LOGNAME、UID、SHELL、HOME、PS1、PS2、…

# AAA=NIHAO
# env | grep AAA
# export AAA
# env | grep AAA
AAA=NIHAO

2、系统变量
系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用。

内置变量 含义
$? 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误
$0 当前执行的程序或脚本名 (./02.sh)
$# 脚本后面接的参数的个数 3个
$* 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开 (参数数组a b c)
$@ 脚本后面所有参数,参数是独立的,也是全部输出 (参数数组a b c)
$1~$9 脚本后面的位置参数,$1表示第1个位置参数,依次类推
${10}~$ 位置变量,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来)
$$ 当前所在进程的进程号,如echo $$
$! 后台运行的最后一个进程号 测试: sleep 400 &(后台运行)/sleep 400(ctrl+z 暂停运行), 再运行jobs, 查看当前进程的后台子进程.
!$ 调用最后一条命令历史中的参数
# cat variable.sh
#!/bin/bash
echo "列出脚本系统变量"
echo "\$0 = $0"    # "\" 是转译的意思,是字符串
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$3 = $3"
echo "\$10 = ${10}"

3、自定义变量
当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。

[root@scp1 ~]# A=hello
[root@scp1 ~]# psPID TTY          TIME CMD
78656 pts/0    00:00:00 bash
78793 pts/0    00:00:00 ps
[root@scp1 ~]# echo $A
hello
[root@scp1 ~]# su user1
[user1@scp1 root]$ psPID TTY          TIME CMD
78885 pts/0    00:00:00 bash
78917 pts/0    00:00:00 ps
[user1@scp1 root]$ echo $A

4、全局变量
全局变量:全局所有的用户和程序都能调用(文件配置),且继承,新建的用户也默认能调用。
解读相关配置文件

文件名 说明 备注
$HOME/.bashrc 当前用户的bash信息,用户登录时读取 定义别名、umask、函数等 $HOME:用户的家目录
$HOME/.bash_profile 当前用户的环境变量,用户登录时读取
$HOME/.bash_logout 当前用户退出当前shell时最后读取 定义用户退出时执行的程序等
/etc/bashrc 全局的bash信息,所有用户都生效
/etc/profile 全局环境变量信息 系统和所有用户都生效
$HOME/.bash_history 用户的历史命令 history -w 保存历史记录 history -c 清空历史记录

说明:以上文件修改后,都需要重新source让其生效或者退出重新登录。

用户登录系统后, 读取相关文件的顺序

  • /etc/profile
  • $HOME/.bash_profile
  • $HOME/.bashrc
  • /etc/bashrc
  • $HOME/.bash_logout

四、变量值及范围控制

1、三种定界符

注意:$()与 等效,但$()更方便嵌套使用

2、变量的作用范围

局部变量:

  • 新定义的变量默认只在当前shell环境中有效
  • 无法在子shell环境中使用

全局变量:

  • 全局变量在当前shell及子shell环境中均有效
  • 使用export可将局部变量声明为全局变量
  • export 局部变量名 :为局部变量添加全局属性
  • export -n 全局变量名 : 取消指定变量的全局属性

五、交互式定义变量

read 标准输入取值(用户自己输入变量值)

目的:read从键盘读入变量值完成赋值
语法:read 选项 变量名

选项 释义
-p 提示用户的信息
-n 限制变量值的长度
-s 不显示用户输入的内容
-t 限制用户输入变量值的超时时间

六、定义变量的类型
declare 选项 变量名=变量值

选项 释义 举例
-i 将变量看成整数 declare -i A=123
-r 定义只读变量 declare -r B=HELLO
-a 定义普通数组
-A 定义关联数组
-x 将变量通过环境导出 declare -x C=666 export C=666

扩展:只读变量

[root@scp1 ~]# name=libai
[root@scp1 ~]# echo $name
libai
[root@scp1 ~]# readonly name
[root@scp1 ~]# echo $name
libai
[root@scp1 ~]# name=lili
-bash: name: 只读变量

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSSCFT [SWPUCTF 2022 新生赛]ez_ez_php

NSSCFT [SWPUCTF 2022 新生赛]ez_ez_php进入之后就看见一段php代码,那就直接开始代码审计<?php error_reporting(0); if (isset($_GET[file])) {if ( substr($_GET["file"], 0, 3) === "php" ) {//截取字符串前三个字符,并与php做判断echo "Nic…

同一工程中的低复位

mark: 低复位和高复位在同一工程中一定要吻合。

序列容器

序列容器 序列容器以线性序列的方式存储元素。它没有对元素进行排序,元素的顺序和存储它们的顺序相同。5 种标准的序列容器,每种容器都具有不同的特性:array<T,N> (数组容器) :长度固定的序列,有 N 个 T 类型的对象,不能增加或删除元素。 vector<T> (向量容器…

Antd-React-TreeSelect前端搜索过滤

Antd-React-TreeSelect前端搜索过滤,antd本事是带有搜索的功能,但是在开发过程中发现自带的搜索功能与我们要使用的搜索过滤还是差了好多,在一些时候搜索为了迎合需要不得不这么操作,那么该操作结合了antd官方的搜索操作,因而在看了网上的一些操作后还是与需求不符合,最后…

方法的三种调用形式

在《可以调用Null的实例方法吗?》一文中,我谈到.NET方法的三种调用形式,现在我们就来着重聊聊这个话题。具体来说,这里所谓的三种方法调用形式对应着三种IL指令:Call、CallVirt和Calli。在《可以调用Null的实例方法吗?》一文中,我谈到.NET方法的三种调用形式,现在我们就…

关于隐藏Selenium绕过检测

. 浏览器指纹识别:网站通常通过浏览器指纹识别来检测访问者的身份。浏览器指纹是浏览器在访问网站时提供的一组信息,包括浏览器类型、版本、插件、用户代理字符串、屏幕分辨率、语言设置、操作系统等。 当你使用 Selenium 或其他自动化工具时,某些指纹信息可能会暴露自动化工…

依赖倒置原则

一、前言 依赖倒置原则也称依赖倒转原则(Dependence Inversion Principle) 看官方定义 高层模块不应该依赖底层模块,二者都应该依赖其抽象 抽象不应该依赖细节,细节应该依赖抽象 依赖倒置的中心思想是面向接口编程 如果你了解点设计模式,应该理解上面的话,但是如果不了解…

常见温升测试方法

常见温升测试方法 温升测试是电器产品安规测试项目之一,是为了检测电器产品及部件的温度变化情况,判断是否符合要求。在设备运行过程中会释放一定的热量,如果内部温度过高会影响产品的性能和稳定性,导致绝缘性能下降,因此温升测试是确保产品稳定运行的重要步骤。那么如何进…

当代码遇上诈骗,开发者该何去何从?

大家好,我是晓凡。 不知道大家最近有没有刷到这样一则消息:知名开源工具 Aria 的开发者删库跑路。 是的,你没听错,这不是段子,这是真事儿! 一言不合就删库? 这事儿得从一条令人震惊的提交记录说起。开发者留下的话,简直比冬天的北风还要刺骨:“因为自己的开源项目被诈…

5 个有趣的 Python 开源项目「GitHub 热点速览」

本期,我从上周的开源热搜项目中精心挑选了 5 个有趣、好玩的 Python 开源项目。 首先是 PyScript,它可以让你直接在浏览器中运行 Python 代码,不仅支持在 HTML 中嵌入,还能安装第三方库。然后是用 Python 写的“魔法虫洞” magic-wormhole,这是一个无需服务器、通过一条命…

耗时9个月,1.34万行代码,这套分布式微服务架构项目,完结啦!

作者:小傅哥 博客:https://bugstack.cn沉淀、分享、成长,让自己和他人都能有所收获!😄大家好,我是技术UP主小傅哥。 耗时9个月,1.34万行代码,55节课程,全程视频手把手。这套微服务、分布式、DDD架构,涵盖了;抽奖、活动、积分、兑换,运用了分库分表、binlog同步数据…

JetBrains PhpStorm 2024.2 (macOS, Linux, Windows) - 高效智能的 PHP IDE

JetBrains PhpStorm 2024.2 (macOS, Linux, Windows) - 高效智能的 PHP IDEJetBrains PhpStorm 2024.2 (macOS, Linux, Windows) - 高效智能的 PHP IDE JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-phpstorm/,查看最新版。原创作品,转载请…