shell - 变量

在C、C++这些强类型语言中,定义变量时必须显示声明变量的类型(比如int、char)。并且当定义一个变量时,会为该变量在内存中分配空间,并且进行初始化,比如

int i;

这条语句定义了变量i,并且在内存中为i分配了int大小(一般为4个字节)的空间,并且该内存空间会随机初始化为某个值。

我们还可以为变量i重新赋值,比如

i = 1;

该语句会把变量i的内存空间赋值为1的二进制。

定义变量

在shell语言中,要弄清楚两个概念:变量和对象变量是没有类型的,类型是对象的,或者说变量的类型是其指向对象的类型。 比如定义变量var1:

var1="value1"

变量var1是没有类型的,对象“value1”是一个字符串类型的对象。我们可以把变量var1看作是对象“value1”的一个引用。既然是引用,那么我们可以让一个变量重新指向别的对象,比如

var2="value2"
var2=3

var2一开始指向对象"value2",然后指向对象3, "value2" 和 3 是实际存在的两个不同的对象,而且是不同类型的两个对象。

注意:

  • 变量名、等号、对象之间不能有空格

  • 定义变量可以让其指向空对象,比如

a=
a=""

变量的命名须遵循如下规则:

  • 命名只能使用英文字母(大小写敏感),数字和下划线

  • 首个字符不能以数字开头

  • 不能使用bash里的关键字(可用help命令查看保留关键字)

使用变量

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

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(该变量不存在,输出为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号,这是个好的编程习惯。

只读变量

使用 readonly 命令可以将变量设置为只读变量,变量只读后就不能重新指向其它对象。下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
var="abc"
readonly var
var="efg"
echo $var

执行脚本,报错如下:

/usercode/file.sh: line 4: var: readonly variable

删除变量

使用 unset 命令可以删除变量,语法:

unset var1

所谓删除变量可以理解为undefine变量,即去掉变量的定义。那么,当删除变量后,该变量就不存在。比如,如下脚本将没有任何输出。

#!/bin/bash
var1="abc"
unset var1
echo $var1

unset 命令不能删除只读变量。

Last updated

Was this helpful?