shell 编程设计到的变量主要为两种类型: 环境变量、位置变量、用户定义变量、预定义变量。

  1. 环境变量:变量中保存的是和系统操作环境相关的数据。(值无法更改,可以新建)

    环境变量会在当前 shell 和这个 shell 的所有子 shell 当中生效,如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的 shell 中生效。

  2. 位置参数变量:用来向脚本当中传递参数或数据,变量名不能自定义,变量作用是固定的。(名称不能自定义,不能新建,只能改值)

  3. 用户自定义变量(也叫本地变量):只在当前的 shell 中生效。

  4. 预定义变量:Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。(名称不能自定义,不能新建,只能改值)

环境变量

shell 维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用 户名、用户的系统 ID(也称为 UID)、用户的默认主目录以及 shell 查找程序的搜索路径。可以用 set 命令来显示一份完整的当前环境变量列表。

常见的比如:SHELL,UID,USER,USERNAME,QT_IM_MODULE,0,BROWSER,EDITOR

  1. 在脚本中,你可以在环境变量名称之前加上美元符($)来使用这些环境变量,如:

    echo "User info for userid: $USER"

  2. 执行 Shell 脚本时,可以向脚本传递参数

    脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数。

  3. 正因为第一条,出现了两个问题。

    1. 只要脚本在引号中出现美元符,它就会以为你在引用一个变量。

      如果你只想想打印 $30 的纯文本,那你需要使用反引号 \$ 进行转移

    2. 直接 $ 引用变量名,出现歧义时,采用 ${}

      因当 echo $12 时, shell 会首先将引号中的变量当作环境变量或者传递的参数解释,因此如果你想要引用 $12 变量,而不是 $12, 那建议这样写 ${12}.

位置变量

位置参数变量

  1. $n :n 为数字,$0 代表命令本身,$1-$9 代表第一个到第九个参数,十以上的参数需要用大括号包含,如 ${10} 、${11}

  2. $* :这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体(如果循环 $* 输出参数,将只输出一次)

  3. $@ :这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待(如果循环 $@ 输出参数,将单独输出每个参数)

  4. $# :这个变量代表命令行中所有参数的个数

预定义变量

  1. $? 退出码

    shell 中运行的每个命令都使用退出状态码(exit status)告诉 shell 它已经运行完毕。 Linux 提供了一个专门的变量 $? 来保存上个已执行命令的退出状态码

    Linux 错误退出状态码没有什么标准可循,但有一些可用的参考:

    exit code

    默认情况下,shell 脚本会以脚本中的最后一个命令的退出状态码退出。exit 命令允许你在脚本结束时指定一个退出状态码,例如:exit 5。(注意:退出状态码最大只能是 255)

  2. $$ :当前进程的进程号(PID)

  3. $! :后台运行的最后一个进程的进程号(PID)

用户变量

用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过 20 个。用户变量区分大小写 使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格(对,不能出现空格)。

shell 脚本会自动决定变量值的数据类型。在脚本的整个生命周期里,shell 脚本中定义的变量会一直保持着它们的值,但在 shell 脚本结束时会被删除掉。

引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符

即:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cat test.sh
#!/bin/bash
var1=1
echo "var1 = $var1"
var2=$var1
echo "var2 = $var2"

$ ./test.sh
var1 = 1
var2 = 1

$ your_name="qinjx"

$ echo $your_name
qinjx

参考资料

  1. Bash 变量:自定义变量 & 环境变量 & 位置参数变量 & 预定义变量
  2. Linux 命令行与 Shell 脚本编程大全