变量
1. 系统变量
在命令行提示符直接执行env、set查看系统或环境变量。env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。可以通过export导出成用户变量。
一些写Shell脚本时常用的系统变量:
$SHELL | 默认Shell |
---|---|
$HOME | 当前用户家目录 |
$IFS | 内部字段分隔符 |
$LANG | 默认语言 |
$PATH | 默认可执行程序路径 |
$PWD | 当前目录 |
$UID | 当前用户ID |
$USER | 当前用户 |
$HISTSIZE | 历史命令大小,可通过HISTTIMEFORMAT变量设置命令执行时间 |
$RANDOM | 随机生成一个0至32767的整数 |
$HOSTNAME | 主机名 |
$$ | $$一个特殊的变量,它代表当前shell进程的PID |
2. 普通变量与临时环境变量
普通变量定义:VAR=value
临时环境变量定义:export VAR=value
变量引用:$VAR
Shell进程的环境变量作用域是Shell进程,当export导入到系统变量时,则作用域是Shell进程及其Shell子进程。
ps -axjf | grep pts命令的含义是:列出所有进程(包括没有控制终端的进程),
并以作业格式显示详细信息,然后通过grep过滤出包含“pts”的行。
这里的“pts”可能是指“pseudo-terminal slave”,即伪终端从设备,这通常与远程连接(如SSH)相关联。
ps:进程状态命令。
-a:显示所有终端的进程。
x:显示没有控制终端的进程。
-j:使用作业格式显示进程列表。
-f:全格式显示,包括更多详细信息。
|:管道符号,将前一个命令的输出作为后一个命令的输入。
grep:一个文本搜索工具,用于搜索包含特定模式的行。
pts:grep搜索的模式,用于匹配包含“pts”的行。
ps axjf输出的第一列是PPID(父进程ID),第二列是PID(子进程ID)
当SSH连接Shell时,当前终端PPID(-bash)是sshd守护程序的PID(root@pts/0),
因此在当前终端下的所有进程的PPID都是-bash的PID,比如执行命令、运行脚本。
所以当在-bash下设置的变量,只在-bash进程下有效,而-bash下的子进程bash是无效的,
当export后才有效。
所以在当前shell定义的变量一定要export,否则在写脚本时,会引用不到。
还需要注意的是退出终端后,所有用户定义的变量都会清除。
3. 位置变量
- 位置变量指的是函数或脚本后跟的第n个参数。
- $1-$n,需要注意的是从第10个开始要用花括号调用,例如$
- shift可对位置变量控制,
#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"
# bash test.sh a b c
1: a
2: c
3:
每执行一次shift命令,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动n位。
4. 特殊变量
$0 | 脚本自身名字 |
---|---|
$? | 返回上一条命令是否执行成功,0为执行成功,非0则为执行失败 |
$# | 位置参数总数 |
$* | 所有的位置参数被看做一个字符串 |
$@ | 每个位置参数被看做独立的字符串 |
$$ | 当前进程PID |
$! | 上一条运行后台进程的PID |
5. 变量引用
赋值运算符 | 示例 |
---|---|
= | 变量赋值 |
+= | 两个变量相加 |