shell变量
# 1. 系统变量
在命令行提示符直接执行 env、set 查看系统或环境变量。
env 显示用户环境变量,set 显示 Shell 预先定义好的变量以及用户变量,可以通过 export 导出成用户变量。
Shell 脚本时常用的系统变量:
- $SHELL 默认 Shell
- $HOME 当前用户家目录
- $IFS 内部字段分隔符
- $LANG 默认语言
- $PATH 默认可执行程序路径
- $PWD 当前目录
- $UID 当前用户 ID
- $USER 当前用户
- $HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间
- $RANDOM 随机生成一个 0 至 32767 的整数
- $HOSTNAME 主机名
# 2. 普通变量与临时环境变量
普通变量定义:VAR=value
临时环境变量定义:export VAR=value
变量引用:$VAR
区别:
Shell 进程的环境变量作用域是 Shell 进程,当 export 导入到系统变量时,则作用域是 Shell 进程及其 Shell 子进程。
ps axjf 输出的第一列是 PPID(父进程 ID),第二列是 PID(子进程 ID)。当 SSH 连接 Shell 时,当前终端 PPID(-bash)是 sshd 守护程序的 PID(root@pts/0),因此在当前终端下的所有进程的 PPID 都是-bash 的 PID,比如执行命令、运行脚本。所以当在-bash 下设置的变量,只在-bash 进程下有效,而-bash 下的子进程 bash 是无效的,当export 后才有效。
进一步说明:再重新连接 SSH,去除上面定义的变量测试下
所以在当前 shell 定义的变量一定要 export,否则在写脚本时,会引用不到。还需要注意的是退出终端后,所有用户定义的变量都会清除。
# 3. 位置变量
位置变量指的是函数或脚本后跟的第 n 个参数。
$1-$n,需要注意的是从第 10 个开始要用花括号调用,例如 ${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:
2
3
4
5
6
7
8
9
10
11
每执行一次 shift 命令,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动 n 位。
# 4. 特殊变量
- $0 脚本自身名字
- $? 返回上一条命令是否执行成功,0 为执行成功,非 0 则为执行失败
- $# 位置参数总数
- $* 所有的位置参数被看做一个字符串
- $@ 每个位置参数被看做独立的字符串
- $$ 当前进程 PID
- $! 上一条运行后台进程的 PID
# 5. 变量引用
赋值运算符
- = 变量赋值
- += 两个变量相加
# 5.1 自定义变量与引用
# VAR=123
# echo $VAR
123
# VAR+=456
# echo $VAR
123456
2
3
4
5
6
7
Shell 中所有变量引用使用$符,后跟变量名。
有时个别特殊字符会影响正常引用,那么需要使用${VAR},例如:
# VAR=123
# echo $VAR
123
# echo $VAR_ # Shell 允许 VAR_为变量名,所以此引用认为这是一个有效的变量名,故此返回
空
# echo ${VAR}
123
#还有时候变量名与其他字符串紧碍着,也会误认为是整个变量:
# echo $VAR456
# echo ${VAR}456
123456
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 5.2 将命令结果作为变量值
# VAR=`echo 123`
# echo $VAR
123
# VAR=$(echo 123)
# echo $VAR
123
2
3
4
5
6
7
这里的反撇号等效于$(),都是用于执行 Shell 命令。
# 6. 双引号和单引号
在变量赋值时,如果值有空格,Shell 会把空格后面的字符串解释为命令:
# VAR=1 2 3
-bash: 2: command not found
# VAR="1 2 3"
# echo $VAR
1 2 3
# VAR='1 2 3'
# echo $VAR
1 2 3
2
3
4
5
6
7
8
9
10
看不出什么区别,再举个说明:
# N=3
# VAR="1 2 $N"
# echo $VAR
1 2 3
# VAR='1 2 $N'
# echo $VAR
1 2 $N
2
3
4
5
6
7
8
单引号是告诉 Shell 忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$、!。
# 7. 注释
Shell 注释也很简单,只要在每行前面加个#号,即表示 Shell 忽略解释。