Linux shell中的变量与"$"符号

Linux的shell脚本中\$可以表示一些特殊变量或者是用于变量相关的计算。

变量的声明

Linux中变量默认是字符串类型:

1
2
3
#!/bin/bash
a=1+1
echo $a
1
1+1

例如上面的脚本输出的是1+1而不是2。所以在非字符串的变量使用和赋值之前,应该利用declare语句对变量进行声明和类型的指定。那么上面的例子应该改写如下:

1
2
3
4
#!/bin/bash
declare -i a
a=1+1
echo $a
1
2

可以看到成功输出为2。这里“-i”的意思是整型,Linux中declare有下面这些参数:

命令 类型
-i 整型
-a 数组类型
-x 环境变量
-r 只读变量
-p 显示被指定变量的声明类型

变量的计算

定义变量的时候,可以不用加$符号,但是使用变量的时候,前面一定要加$符号。在变量计算的时候,若不加$符号,则还是会被默认为字符串类型,例如下面的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
declare -i a
declare -i b
declare -i c
a=1+1
b=2+2
c=a+b
d=a+b

echo $((a+b))
echo $[a+b]
echo $c
echo $d
--------
6
6
6
a+b

总结来说,有下面这几种变量计算的方式:

  1. 在变量前面加上$符号进行计算
  2. 利用$[]进行计算。在利用这种方法计算的时候,中括号里面的变量可以不加$符号,因为已经默认了计算结果为整型。
  3. 利用$(())计算。效果等同于$[]
  4. 使用let进行计算
    如下:

    1
    2
    3
    4
    5
    #!/bin/bash
    let 'x=1+1'
    echo $x
    --------
    2

特殊变量

此外,Linux中定义了下面的特殊变量:

变量名 作用
$0 当前脚本的名字
$n 传递给脚本或者函数的参数,n表示第几个参数
$# 传递给脚本或函数的参数个数
$* 传递给脚本或函数的所有参数
$@ 传递给脚本或者函数的所有参数
$$ 当前shell脚本进程的PID
$? 函数返回值,或者上个命令的退出状态
$FUNCNAME 当前函数名
$LINENO 当前行号
$OSTYPE 操作系统类型
$PATH PATH路径
$PPID 当前shell进程的父进程ID
$PWD 当前工作目录
$SECONDS 当前脚本运行秒数
$TMOUT 不为0时,超过指定的秒将退出shell
$UID 当前用户ID
0%