定义变量

定义变量时,变量名不加美元符号($),并且变量名和等号中不能有空格。如:

1
tempVar="variable"

同时,变量名的命令规则如下:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,可以使用下划线 _
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用 compgen -k 命令查看保留关键字)。

使用变量

使用一个定义过的变量,只要在变量名前面加$符号即可,如:

1
2
3
tempVar="variable"
echo $tempVar
echo ${tempVar}

变量名外面的大括号是可选的,加大括号是为了帮助解释器识别变量的边界,防止出现识别错误变量。如:

1
2
str="shell"
echo "I am learning ${str}skill"

打印出来就是I am learning shellskill,如果没有大括号,则打印出来的内容是I am learning,系统识别strskill为一个变量,但并没有此变量,因此打印变量为空。所以使用变量时建议加上大括号,更为规范。

readonly 只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。如:

1
2
3
4
#!/bin/bash
myVar="change"
readonly myVar
myUrl="http://www.runoob.com"

运行时报错:

1
/bin/sh: NAME: This variable is read only.

删除变量

使用 unset 命令就可以删除变量。

1
unset myVar

变量被删除后不能再次使用。并且 unset 命令不能删除只读变量

(当脚本文件规模不大时,要删除变量的话直接在脚本里把变量去掉就行了。)

变量类型

  • 环境变量
  • 本地变量
  • 局部变量
  • 位置变量
  • 特殊变量(bash内置变量,也称系统变量)

环境变量

1
export var_name=value    //作用域为当前shell进程及其子进程`

给Linux系统配置过JDK的同学应该对这个变量很熟悉

本地变量

1
var_name=value   //本地变量,作用域为当前shell进程,对当前shell外的其他shell进程,v包括当前shell,子shell进程均无效

局部变量

1
local var_name=value  //局部变量,作用域为当前代码段,常用于函数

局部变量也是一种本地变量

位置变量

1
2
3
$1,$2,$3, ....  //用来引用脚本的参数
shift [num] //位置变量使用完以后退出,后面的参数向前推进
shift 1 //一次往前推,例:$1完成任务后变成$2执行

特殊变量

1
2
3
4
5
6
7
$#   //是传给脚本的参数个数
$0 //是脚本本身的名字
$! //是shell最后运行的后台Process的PID
$@ //是传给脚本的所有参数的列表
$* //是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ //是脚本运行的当前进程ID号
$? //是显示上条命令的退出状态,0表示没有错误,其他表示有错误
1
2
3
4
5
6
7
8
9
bash内建环境变量,这些变量不能当作自定义变量使用
PATH
SHELL
UID
HISTSIZE
HOME
PWD
HISTFILE
PS1