
1.4 Shell变量
1.4.1 系统变量
在命令行提示符直接执行 env、set 查看系统或环境变量。env 显示用户环境变量,set 显示 Shell 预先定义好的变量以及用户变量。可以通过 export 导出成用户变量。
一些写 Shell 脚本时常用的系统变量:
| $SHELL | 默认 Shell |
| --------- | -------------------------------------------------------- |
| $HOME | 当前用户家目录 |
| $IFS | 内部字段分隔符 |
| $LANG | 默认语言 |
| $PATH | 默认可执行程序路径 |
| $PWD | 当前目录 |
| $UID | 当前用户 ID |
| $USER | 当前用户 |
| $HISTSIZE | 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间 |
| $RANDOM | 随机生成一个 0 至 32767 的整数 |
| $HOSTNAME | 主机名 |
1.4.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,否则在写脚本时,会引用不到。
还需要注意的是退出终端后,所有用户定义的变量都会清除。
在/etc/profile 下定义的变量就是这个原理,后面有章节会讲解 Linux 常用变量文件。
1.4.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:
每执行一次 shift 命令,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动n 位。
1.1.4 特殊变量
| $0 | 脚本自身名字 |
| ---- | ----------------------------------------------------------- |
| $? | 返回上一条命令是否执行成功,0 为执行成功,非 0 则为执行失败 |
| $# | 位置参数总数 |
| $* | 所有的位置参数被看做一个字符串 |
| $@ | 每个位置参数被看做独立的字符串 |
| $$ | 当前进程 PID |
| $! | 上一条运行后台进程的 PID |
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Eternal Night
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果