Shell—2.shell变量
基本概念
- 用一个固定的字符串去表示一个不固定的内容,就是变量
- Bash中所有的变量都是字符串类型
- 变量用等号连接值,等号两侧不能有空格
- 变量的值如果有空格,需要使用单引号或双引号
- 变量的值中,可以使用\转义符
- 如需增加变量的值,可以进行变量值的叠加,不过变量需用 "$变量名" 或 ${变量名} 包含
- 可以把命令的结果作为变量值赋予变量,需要使用反引号或者$()包含命令
- 环境变量名建议大写,便于区分
自定义变量
- 定义变量 变量名=变量值
- 调用变量
| echo $变量名
| echo ${变量名} 可以分割变量名后边的字符串 echo ${变量名}ok
| 第二种方式还可以切片 ${a:2:3}从第3个开始,切3个
- set 用来显示本地变量
- env 用来显示环境变量
- export 用来显示和设置环境变量
- 把命令的结果赋值给变量
| ``
| $()
- 删除变量 unset 变量名
- 变量的叠加
| aa="$aa"456
| aa=${aa}789
- 作用范围:仅在当前shell中有效
环境变量
- 定义环境变量 export 变量名=变量值 写入了环境变量配置文件
- 环境变量概念
| 保存的是和系统操作环境相关的数据
| 用户自定义变量只在当前的shell生效
| 环境变量会在当前shell和它的所有子shell当中生效
| 如写入相应配置文件,那此环境变量会在所有的shell中生效
- 两个环境变量 PATH PS1
| PATH 用冒号分割的一个一个路径
| 自己写的脚本并不推荐放进path中 最好用变量累加的方式 PATH="$PATH":/root/sh 临时生效
| PS1 定义系统提示符的变量 PS1='[\u@\h \t \w]\$ ' 设定提示符 \w是当前路径
- 让环境变量永久生效 写入到 /etc/profile 中,最下追加写入 再执行 source /etc/profile
| export PATH=$PATH:/you/want/add/path
- 定义环境变量的两种方式
| export 变量名 // 将定义好的变为环境变量
| export 变量名=变量值 // 定义变量
位置参数变量
- 向脚本当中传递参数或数据;变量名不能自定义,变量作用固定
- $n n为数字,1到9,代表1到9个参数;10个以上参数用大括号${10}
- $* 代表命令行中所有参数,把所有参数看成一个整体(类似python聚合参数)
- $@ 也代表命令行中所有参数,不过是把每个参数区分对待
- $# 代表命令行中所有参数的个数
-------------
#!/bin/bash
ping -c1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is OK!"
else
echo "$1 is err!"
fi
-------------
#!/bin/bash
ping -c1 www.baidu.com &> /dev/null
if [ $? -eq 0 ];then
echo "网络访问正常!"
else
echo "网络访问异常!!"
fi
--------------
预定义变量
- bash中定义好的变量;变量名不能定义;变量作用固定
- $? 最后一次执行命令的返回状态。为0,上个命令执行;不为0,执行错误。
- $$ 当前进程的PID
- $! 后台运行的最后一个进程的进程号(PID)
- $0 显示脚本名 // 两个相似命令 basename dirname
--- 操作示例 ---
#!/bin/bash
echo "the current process is $$" // 输出当前进程PID;就是脚本执行时,生成的进程PID
find /root -name test.sh & // root下找test.sh;&是把命令放入后台执行,工作管理
echo "The last one Daemon process is $!"
接收键盘输入
- read 【选项】【变量名】
- -p 提示信息 等待read输入时,输出提示信息
- -t 秒数 read命令会一直等待用户输入 使用此选项可以指定等待时间
- -n 字符数 read命令只接收指定的字符数,就会执行
- -s 隐藏输入的数据 适用于机密信息的输入
-----------
#!/bin/env bash
read -p "请输入要ping的IP地址:" ip
ping -c1 $ip &> /dev/null
if [ $? -eq 0 ];then
echo "$ip is OK!"
else
echo "$ip is error!"
fi
------------
定义有类型的变量
- declare 【选项】 变量名=变量值
- 目的 给变量做一些限制 固定变量的类型 比如 整型 只读
- -i 将变量看成整数
- -r 定义只读变量
- -a 定义普通数组 查看普通数组
- -A 定义关联数组 查看关联数组
- -x 将变量通过环境导出
| declare -x AAA=123456 等于 export AAA=123456
全局变量
- 相关配置文件
| $home/.bashrc 当前用户的bash信息,用户登陆时读取 定义别名,umask,函数等
| $home/.bash_profile 当前用户的环境变量,用户登陆时读取
| $home/.bash_logout 当前用户退出当前shell时最后读取 定义用户退出时执行的程序等
| /etc/bashrc 全局的bash信息,所有用户都生效
| /etc/profile 全局环境变量信息 系统和所有用户都生效
# 以上文件修改后 都需要重新source让其生效或者退出重新登陆
- 用户登陆系统读取相关文件顺序
| 1./etc/profile
| 2.$HOME/.bash_profile
| 3.$HOME/.bashrc
| 4./etc/bashrc
| 5.$HOME/.bash_logout // 登出时访问的文件
- 补充下6个文件说明
| /etc/profile // 系统级文件
| /etc/bashrc
|
| $HOME/.bash_profile // 用户级文件
| $HOME/.bashrc
| $HOME/.bashrc.logout // 这两个登出时访问
| $HOME/.bash history
系统变量
- 内置bash中变量: shell本身已经固定好了它的名字和作用
- $? 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误
- $0 当前执行的程序或脚本名
- $# 脚本后面接的参数的个数
- $* 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
- $@ 脚本后面的位置参数 参数是独立的 也是全部输出
- $1~$9 基本后面的位置参数 $1表示第一个位置参数 依次类推
- ${10}~${n} 扩展位置参数,第10个文职变量必须用{}大括号括起来(2位数字以上括起来)
- $$ 当前所在进程的进程号, 如echo $$
- $! 后台运行的最后一个进程号(当前终端)
- !$ 调用最后一条命令历史中的参数
!
shell的执行环境
- 在脚本中执行cd到新目录
- 使用如下4种方式执行shell脚本
| bash bash.sh // 当前路径不会变化
| ./bash sh
| . bash.sh // 当前路径改变
| source bash.sh
- 前两种方式是打开了一个新的子shell执行 // sub shell
- 后两种是在当前shell中执行
| 所以重新载入shell有两种方式 source 和 .
- 大多数执行程序都是在子shell中执行的。
- su - user 和 su user 区别
| su user 没有加载用户的环境
| su - user 就是切换用户了
分类:
Linux_4.Shell篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律