bash shell 编程和其他编程语言差不多,同样包含变量(存放字符串和数值的容器,可以进行修改、比较、传递)。在引用 bash 变量时,可以使用一些非常特殊的运算符。bash 还拥有内建变量,这些变量可以提供有关脚本中其他变量的重要信息。本章将介绍 bash 变量和一些特殊的变量引用机制,展示如何将其运用于你自己的脚本。
bash 脚本中的变量名称通常采用全大写,但这并非强制性的,只是一种常见做法而已。变量不用事先声明,直接使用就行了。变量基本上都是字符串类型,不过有些运算符能够将变量内容视为数字。变量的实际用法如下所示。
# 使用shell变量的普通脚本
# (不过好歹也注释过了)
MYVAR="something"
echo $MYVAR
# 写法类似,但没有引号
MY_2ND=anotherone
echo $MY_2ND
# 这里需要使用引号:
MYOTHER="more stuff to echo"
echo $MYOTHER
bash 变量的语法有两处要点,但可能不那么一目了然。首先,赋值语法 name=value 看起来相当直观,但 = 两侧不能有任何空白字符。
我们来想想为什么是这样。记住,shell 的主要目的是执行命令:你在命令行上指定要执行的命令。命令名之后的任何单词都会作为参数传给该命令。例如,当你敲入:
ls filename
其中,单词 ls 是命令名,filename 是这个示例中第一个,也是唯一一个参数。
这有什么关系?考虑一下,如果允许 = 两侧出现空白字符,那么变量赋值就会变成下面这样:
MYVAR = something
看出来没有,此时 shell 很难区分出到底是要调用命令(如本例中的 ls)还是要给变量赋值。对于能够以 = 为参数的命令(如 test)更是如此。所以,还是让事情简单点吧:变量赋值时,shell 不允许在 = 两侧出现空白字符。该规定的另一方面也值得注意:不要在文件名中使用 =,对于 shell 脚本尤为如此(尽管可行,但不推荐)。
其次需要注意的是,引用变量时要使用 $
符号。给变量赋值时不需要在变量名前加 $
,但获取变量值时需要。(出现在表达式 $(())
中的变量是个例外。)用编译器的行话来说,赋值和检索值在语法上的差异就是变量的左值(L-value)与右值(R-value)之间的差异(赋值运算符的左侧和右侧)。
原因很简单,就是为了消除歧义。思考下列情况:
MYVAR=something
echo MYVAR is now MYVAR
正如这个示例试图指出的,你能分辨出哪个是字符串 MYVAR,哪个是变量 MYVAR 吗?使用引号?如果将字符串放进引号,那么一切只会更乱,你得将包括命令在内的所有非变量名全部加上引号!没人想像下面这样敲命令:
"ls" "-l" "/usr/bin/xmms"
(对于那些想试试看的用户来说,没错,这么写确实也管用。)因此,不用将一切都加上引号,使用右值语法来引用变量就够了。要想获得与某个变量名相关联的值,在变量名前加上 $ 符号即可。
MYVAR=something
echo MYVAR is now $MYVAR
只需记住,bash 中的一切都是字符串,所以需要用 $
来表明变量引用。另外,有可能还得在变量名两边加上花括号。
酷客网相关文章:
评论前必须登录!
注册