在 Linux 中,变量依照作用域分为三种,分别是环境变量、普通变量、导出变量。
公共变量被存放在/etc/profile
文件中,用户变量被存放在~/.profile
中。
cat /etc/profile
可以通过declare {var}
声明变量或使用{var}={value}
直接定义。通过echo ${var}
查看变量。通过unset {var}
释放变量。
declare temp
temp=333
echo $temp
unset temp
export {var}
对普通变量进行导出,此时其子进程也可以访问该变量。当前进程结束时,该导出变量一并销毁。
export temp
有三个命令可以查看变量:
set # 显示所有变量
env # 显示用户相关的环境变量
export # 显示导出变量
export 变量名=变量值 #申明变量
env# 查询变量
echo $变量名# 变量调用
unset 变量名 #删除变量
pstree 树形显示进程数
#没有这条命令可以执行以下命令下载:
#yum -y install psmisc
#yum provides /命令 查看没有的命令的安装包 配合yum -y install使用
定义阐述:环境变量配置文件中,主要是定义对系统的操作环境生效的系统默认环境变量,比如 PATH、HISTSIZE、PS1、HOSTNAME等 默认环境变量。
以下几个环境变量的配置文件是最主要的:
环境变量配置文件调用图:
这些是在登陆的时候挨个调用,所以在这里面设置环境变量,登陆之后就会自动设置好
登陆输入密码之后,第一步是读取/etc/profile文件
/etc/profile的作用:
USER变量
LOGNAME变量
MAIL变量
PATH变量
HOSTNAME变量
HISTSIZE变量
umask
里面有以上环境变量的配置接下来便调用/etc/profile.d/ .sh文件*
然后就是下面的文件,语言包文件,识别系统自带的语言*~/.bash_profile的作用
调用了~/.bashrc文件。
在PATH变量后面加入了“:$HOME/bin” 这个目录~/.bashrc的作用
定义默认别名调用/etc/bashrc/etc/bashrc的作用
PS1变量
umask
PATH变量调用/etc/profile.d/*.sh文件
这一块就是进入界面以内,切换shell登陆方式,这种不需要密码,所以和前面的/etc/profile的作用不冲突
变量添加:
以PATH
为例,将某路径添加到PATH
环境变量中。
由于PATH
变量以:
作为分隔符,所以我们应该将:{dir}
追加到PATH
的末尾。
PATH=$PATH:/home/user/dir
字符串拼接不需要使用+
,直接顺着写即可。
注意!!这种方式添加的环境变量是临时的,当关闭终端时失效。
想要让环境变量一直生效,可以让上述命令在终端初始化时执行,终端在初始化时会调用一个脚本,这里使用的是zsh
,所以这个脚本位于用户主目录下~/.zshrc
。
我们可以编辑他,将这条命令添加进去。
echo "PATH=$PATH:/home/user/dir" >> .zshrc
不过对于不同终端,这个初始化脚本也不同,例如bash
的初始化脚本是.bashrc
。
可以通过cat /etc/shells
查看已安装的Shell
cat /etc/shells
介绍一个命令echo
:
echo {string}
echo
可以将字符串输出到终端,如果要输出变量,那么变量名前应添加一个$
。
echo
还可以将输出定向至文件:
echo {string} > {filename}
echo {string} >> {filename}
>
是直接覆盖文件,>>
是追加到文件。
变量修改
变量修改方式 | 说明 |
---|---|
${变量名#匹配字串} |
从头向后开始匹配,删除符合匹配字串的最短数据 |
${变量名##匹配字串} |
从头向后开始匹配,删除符合匹配字串的最长数据 |
${变量名%匹配字串} |
从尾向前开始匹配,删除符合匹配字串的最短数据 |
${变量名%%匹配字串} |
从尾向前开始匹配,删除符合匹配字串的最长数据 |
${变量名/旧的字串/新的字串} |
将符合旧字串的第一个字串替换为新的字串 |
${变量名//旧的字串/新的字串} |
将符合旧字串的全部字串替换为新的字串 |
例如,我想将PATH
变量中的:/home/user/dir
删除:
PATH={PATH%%:/home/user/dir}
执行初始化脚本
更改配置文件后,如果想要立即生效,就要重新执行一遍该脚本。
我们可以使用source
命令:
source ./.zshrc
或者直接简写为:
. ./zshrc
变量设置规则:
变量的分类:
系统常见环境变量
PATH:系统查找命令的路径
这便是输入命令之前不用输入绝对路径的根本原因,系统会提前在PATH环境变量里的所有路径中查询一遍有没有你输入的命令,找到之后直接执行。
如果你想直接执行shell脚本,不加绝对路径,直接写入PATH环境变量,使用叠加。
例子:
echo $PATH PATH="$PATH":/root/sh #PATH变量叠加
此后,/root/sh路径里面的执行文件都可以在任意目录下直接执行,不过是临时生效
PS1:定义系统提示符的变量 用来改[root@localhost ~]# 这个显示
下面是系统提示符的变量:
在脚本中主要针对参数的一些变量操作。
位置参数 变量 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1-9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一 到第九个参数,十以上的参数需要用大括号 包含,如9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}. |
$* | 这个变量代表命令行中所有的参数,$*把所 有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过 $@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
举例:
#$n的例子:一个加法器
num1=$1
num2=$2
sum=$(( $num1 + $num2)) #变量sum的和是num1加num2 echo $sum #打印变量sum的值
echo $sum
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变 量的值为0,证明上一个命令正确执行;如果 这个变量的值为非0(具体是哪个数,由命令 自己来决定),则证明上一个命令执行不正确 了。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
echo “The current process is $$”
#输出当前进程的PID。
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件 #符号&的意思是把命令放入后台执行,工作管理在系统管理章节会详细介绍
echo "The last one Daemon process is $!"
接受键盘输入
read [选项] [变量名]
注销时生效的环境变量配置文件
其他配置文件
Shell登录信息
本地终端欢迎信息: /etc/issue
转义符 | 作用 |
---|---|
\d | 显示当前系统日期 |
\s | 显示操作系统名称 |
\l | 显示登录的终端号,这个比较常用。 |
\m | 显示硬件体系结构,如i386、i686等 |
\n | 显示主机名 |
\o | 显示域名 |
\r | 显示内核版本 |
\t | 显示当前系统时间 |
\u | 显示当前登录用户的序列号 |
远程终端欢迎信息:/etc/issue.net
/etc/ssh/sshd_config
决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)。登陆后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息。
declare 声明变量类型
declare [+/-][选项] 变量名
数值运算
aa=11
bb=22 #给变量aa和bb赋值
declare -i cc=$aa+$bb
aa=11
bb=22 #给变量aa和bb赋值
dd=$(expr $aa + $bb)# dd的值是aa和bb的和。注意“+”号左右两 侧必须有空格
let与expr一样。
aa=11
bb=22 给变量aa和bb赋值
ff=$(( $aa+$bb ))
gg=$[ $aa+$bb ]
优先级表:
优先级 运算符 说明
13 -, + 单目负、单目正
12 !, ~ 逻辑非、按位取反或补码
11 ,/, % 乘、除、取模
10 +, - 加、减
9 << , >> 按位左移、按位右移
8 < =, > =, < , > 小于或等于、大于或等于、小于、大于
7 == , != 等于、不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =,+=,-=,=,/=,%=,&=, ^=,赋值、运算且赋值 |=, <<=, >>=
用来测试一个变量到底有没有设置,测试表:
变变量置换方式 变量y没有设置 变量y为空值 变量y设置值
x= y − 新值 x = 新值 x 为空 x = {y-新值} x=新值 x为空 x= y−新值x=新值x为空x=y
x= y : − 新值 x = 新值 x = 新值 x = {y:-新值} x=新值 x=新值 x= y:−新值x=新值x=新值x=y
x= y + 新值 x 为空 x = 新值 x = 新值 x = {y+新值} x为空 x=新值 x=新值 x= y+新值x为空x=新值x=新值x={y:+新值} x为空 x为空 x=新值
x= y = 新值 x = 新值 y = 新值 x 为空 y 值不变 x = {y=新值} x=新值 y=新值 x为空 y值不变 x= y=新值x=新值y=新值x为空y值不变x=y y值不变
x= y : = 新值 x = 新值 y = 新值 x = 新值 y = 新值 x = {y:=新值} x=新值 y=新值 x=新值 y=新值 x= y:=新值x=新值y=新值x=新值y=新值x=y y值不变
x= y ? 新值 新值输出到标准错误输出 ( 就是屏幕 ) x 为空 x = {y?新值} 新值输出到标准错误输出(就是屏幕) x为空 x= y?新值新值输出到标准错误输出(就是屏幕)x为空x=y
x= y : ? 新值 新值输出到标准错误输出新值输出到标准错误输 x = {y:?新值} 新值输出到标准错误输出 新值输出到标准错误输 x= y:?新值新值输出到标准错误输出新值输出到标准错误输x=y
例子:
测试x=${y-新值} 测试y变量存不存在
unset y 删除变量y
x=${y-new} 进行测试
echo $x
显示new,y变量不存在
因为变量y不存在,所以x=new
y="" 给变量y赋值为空
x=${y-new} 进行测试
echo $x
显示空,y为空值
y=old 给变量y赋值
x=${y-new} 进行测试
echo $x
显示old ,y变量存在且有值
在用到的时候查询就好,不需要死记硬背。这个表是在写脚本的时候给电脑程序看的,人不参与其中