在 Linux(Shell) 里,存在两种类型的变量:

  1. 系统变量 - 由 Linux 自身创建和维护的变量。这类变量都是用大写字母来定义的。
  2. 用户定义的变量(User defined variables, UDV) - 由用户创建并维护,这类变量用小写字母来定义。

系统变量

重要的系统变量一览

系统变量 含义
BASH [1] shell 的名字
BASH_VERSION shell 的版本名
COLUMNS 屏幕可以显示的列的数量
LINES 屏幕上可以显示的行的数量
HOME 主目录的位置
LOGNAME 登陆的账号名
OSTYPE 系统类型
PATH path 环境变量的设置
PS1 prompt 设置
PWD 当前工作目录
SHELL shell的名字
USERNAME 当前登陆的用户名

示例

1
2
3
$ echo Hello $LOGNAME
$ echo You\'re using $OSTYPE
$ echo Current working place: $PWD

内置的shell变量

另外 Shell 也内置了一些特殊的变量:

内置的shell变量 含义
$# 命令行的参数的数量,不包含脚本名称,相当于C语言的 argc-1
$* 执行该脚本时所跟的所有参数
$@ 同上
$- Option supplied to shell
$$ shell的进程PID号
$! 最后一个启动的后台进程的PID号 (进程在启动时如果后面跟着 & 就会以后台方式启动)

示例

1
2
3
4
5
6
7
8
9
#!/bin/sh
#
# Script that demos, command line args
#
echo "Total number of command line argument are $#"
echo "$0 is script name"
echo "$1 is first argument"
echo "$2 is second argument"
echo "All of them are :- $* or $@"

用户定义的变量

定义用户变量

1
<变量名>=<>

= 号左右不能有空格,否则左边的变量名会被误认为是一个命令!

示例

1
2
3
4
5
6
$ no=10 # this is ok
$ 10=no # Error, NOT Ok, Value must be on right side of = sign.
# To define variable called 'vech' having value Bus
$ vech=Bus
# To define variable called n having value 10
$ n=10

清除变量

使用 unset 命令清除变量。

示例

1
2
3
4
$ A=5
$ echo A
$ unset A
$ echo A

显示所有本地的shell变量

使用 set 命令可以显示所有本地定义的shell变量。

设置只读变量

如果设置变量时,不想再改变其值,可以用 readonly 命令将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。

示例

1
2
3
4
$ A=5
$ readonly A
$ A=4
zsh: read-only variable: A

变量命名规则(UDV和系统变量都适用)

  1. 变量名必须用字母或下划线 _ 开头,后面跟着一个或多个其他字符 [2]

有效的 shell 变量如下:

1
2
3
4
HOME
SYSTEM_VERSION
vech
no

  1. 不允许在等号两端任何一边加空格。

正确的变量赋值语句:

1
$ no=10

错误的变量赋值语句:

1
2
3
$ no =10
$ no= 10
$ no = 10

  1. 和 Linux 中文件名一样,变量名对大小写敏感。例如

1
2
3
4
$ no=10
$ No=11
$ NO=20
$ nO=2

上面的四个变量名都是不相同的。如果要打印 20 我们需要使用 $ echo $NO 而不是下面任何一条语句:

1
2
3
$ echo $no # will print 10 but not 20
$ echo $No# will print 11 but not 20
$ echo $nO# will print 2 but not 20

  1. 允许像下面这样定义 NULL 变量 [3]

1
2
$ vech=
$ vech=""

如果此时尝试用下面的语句

1
$ echo $vech

来输出 $vech 变量,将不会输出任何东西,因为该变量还没有值。

  1. 不允许使用 ?* 等字符来命名。

使用变量

示例

  1. 定义一个变量 x ,赋值为 10 ,并在屏幕上打印它:

1
2
$ x=10
$ echo $x

  1. 定义一个变量 xn,赋值为 Rani 并在屏幕上打印它:

1
2
$ xn=Rani
$ echo $xn

  1. 打印两个数相加的结果,例如 6+3

不能直接 $ echo 6+3,这样打印出来的结果是 6+3 ,而不是两数相加的结果 9

扩展阅读

  1. linux超级基础系列——shell变量(本地变量和环境变量)

  1. 只在 bash 下有效,如果用的是 zsh,则替换成相应的 zsh 变量。下面的 BASH_VERSION 也一样

  2. 如果单个字母作为变量名

  3. NULL 变量是在定义时不为其赋值的变量