shell 变量
shell 编程设计到的变量主要为两种类型: 环境变量、位置变量、用户定义变量、预定义变量。
环境变量:变量中保存的是和系统操作环境相关的数据。(值无法更改,可以新建)
环境变量会在当前 shell 和这个 shell 的所有子 shell 当中生效,如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的 shell 中生效。
位置参数变量:用来向脚本当中传递参数或数据,变量名不能自定义,变量作用是固定的。(名称不能自定义,不能新建,只能改值)
用户自定义变量(也叫本地变量):只在当前的 shell 中生效。
预定义变量:Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。(名称不能自定义,不能新建,只能改值)
环境变量
shell 维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用 户名、用户的系统 ID(也称为 UID)、用户的默认主目录以及 shell 查找程序的搜索路径。可以用 set 命令来显示一份完整的当前环境变量列表。
常见的比如:SHELL,UID,USER,USERNAME,QT_IM_MODULE,0,BROWSER,EDITOR
在脚本中,你可以在环境变量名称之前加上美元符(
$
)来使用这些环境变量,如:echo "User info for userid: $USER"
执行 Shell 脚本时,可以向脚本传递参数
脚本内获取参数的格式为:
$n
。n 代表一个数字,1 为执行脚本的第一个参数。正因为第一条,出现了两个问题。
只要脚本在引号中出现美元符,它就会以为你在引用一个变量。
如果你只想想打印
$30
的纯文本,那你需要使用反引号\
对$
进行转移直接
$
引用变量名,出现歧义时,采用${}
因当
echo $12
时, shell 会首先将引号中的变量当作环境变量或者传递的参数解释,因此如果你想要引用$12
变量,而不是$1
2, 那建议这样写${12}
.
位置变量
位置参数变量
$n
:n 为数字,$0
代表命令本身,$1-$9
代表第一个到第九个参数,十以上的参数需要用大括号包含,如${10} 、${11}
$*
:这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体(如果循环$*
输出参数,将只输出一次)$@
:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待(如果循环$@
输出参数,将单独输出每个参数)$#
:这个变量代表命令行中所有参数的个数
预定义变量
$?
退出码shell 中运行的每个命令都使用退出状态码(exit status)告诉 shell 它已经运行完毕。 Linux 提供了一个专门的变量
$?
来保存上个已执行命令的退出状态码Linux 错误退出状态码没有什么标准可循,但有一些可用的参考:
默认情况下,shell 脚本会以脚本中的最后一个命令的退出状态码退出。exit 命令允许你在脚本结束时指定一个退出状态码,例如:
exit 5
。(注意:退出状态码最大只能是 255)$$
:当前进程的进程号(PID)$!
:后台运行的最后一个进程的进程号(PID)
用户变量
用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过 20 个。用户变量区分大小写 使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格(对,不能出现空格)。
shell 脚本会自动决定变量值的数据类型。在脚本的整个生命周期里,shell 脚本中定义的变量会一直保持着它们的值,但在 shell 脚本结束时会被删除掉。
引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。
即:
1 | cat test.sh |
参考资料
- Bash 变量:自定义变量 & 环境变量 & 位置参数变量 & 预定义变量
- Linux 命令行与 Shell 脚本编程大全