变量的名字就是变量保存值的地方。引用变量的值就叫做变量替换。如果variable1是一个>变量的名字,那么$variable就是引用这变量的值,即这个变量所包含的数据。
变量被一对双引号括起来的时候变量替换是不会被阻止的。所以双引号被称为部分引用。如
果使用单引号的话,那么变量替换就会被禁止了,变量名只会被解释成字面的意思。
$variable事实上只是${variable}的简写形式。在某些上下文中$variable可能会引起错误>。这时候就需要使用${variable}了。
一个未初始化的变量将会是"null"值。在给变量赋值之前就使用这个变量通常都会引起问题
。如果是算术运算则这个null值为0,运算没有问题。
变量赋值
= 赋值操作(前后都不能有空白)因为=和-eq都可以用作条件测试操作。注意不要与这
里的赋值操作相混淆。
#!/bin/bash
echo
a=879 #使用=赋值
echo "The value of \"a\" is now $a."
let a=16+5 #使用let赋值
echo "The value of \"a\" is now $a."
echo
#在'for'循环中赋值(事实上,这是一种伪赋值)
echo -n "Values of \"a\" in the loop are: "
for a in 7 8 9 11
do
echo -n "$a "
done
echo
echo
#使用'read'命令进行赋值(这也是一种赋值的类型)
echo -n "Enter \"a\" "
read a
echo "The value of \"a\" is now $a."
echo
exit 0
一种复杂的变量赋值是用命令替换符把命令的输出赋值给变量
#!/bin/bash
a=23
echo $a
b=$a
echo $b
a=`echo Hello!` #把'echo'命令的结果赋值给变量a
echo $a
a=`ls -l`
echo $a #没有引号将会删除ls结果中多余的tab和换行符。
echo
echo "$a" #加上引号,保留ls结果中的空白符
exit 0
使用$(...) 机制来进行变量赋值(这是一种比后置引用(反引号`)更新的一种方法)。事实上这两种方法都是命令替换的一种形式。
# From /etc/rc.d/rc.local
R=$(cat /etc/redhat-release)
arch=$(uname -m)
Bash变量不区分类型
不像其他程序语言,Bash并部队变量区分类型。本质上,Bash变量都是字符串。但是依赖于具体的上下文,Bash也允许比较操作和整数操作。其中的关键因素就是,变量中的值是否只有数字。
特殊的变量类型
局部变量 这种变量只有在代码块或者函数中才可见(具体参见函数中的局部变量)
环境变量 这种变量将影响用户接口和shell的行为。
在通常情况下,每个进程都有自己的“环境“ 这个环境是由一组变量组成的,这些变量中存有进程可能需要引用的信息。在这种情况下,shell与一个一般的进程没什么区别。
每次当一个shell启动时,它都将创建适合于自己环境变量的shell变量。更新或者添加一个新的环境变量的时候,这个shell都会立刻更新它自己的环境变量。并且所有的shell子进程(即这个shell所执行的命令)都会继承这个环境
分配给环境变量的空间是有限的。创建太多环境变量,或者给一个环境变量分配太多的空间都会引起错误。
如果一个脚本要设置一个环境变量,那么需要将这些变量"export"出来,也就是需要通知到脚本本地的环境。这是export命令的功能。
一个脚本只能够export变量到这个脚本所产生的子进程,也就是说只能够对这个脚本所产生的命令和进程起作用。如果脚本是从命令行中调用的,那么这个脚本所export的变量是不能影响命令行环境的。也就是说,子进程是不能够export变量来影响产生自己的父进程的环境的。
位置参数
从命令行传递到脚本的参数:$0,$1,$2,$3...
$0就是脚本文件自身的名字,$1是第一个参数...$9之后的位置参数就必须用大括号括起来。比如${10},${11}.
两个比较特殊的变量$*和$@表示所有的位置参数。
{}标记法提供了一种提取从命令行传递到脚本的最后一个参数的简单方法,但使用这种方法是还需要使用间接引用。
args=$# #位置参数的个数
lastarg=${!args} #间接引用 #不能直接使用lastarg=${!$#},这样会产生错误。
#或:lastarg=${!#}
一些脚本可能会依赖于使用不同的调用名字,来表现出不同的行为。如果想要达到这种目的,一般都需要在脚本中检查$0。因为脚本只能够有一个真正的文件名,如果要产生多个名字,必须使用符号链接。
如果脚本需要一个命令行参数,而在调用的时候,这个参数没有被提供,那么这就可能造成这个参数赋一个null变量,通常情况下,这都会产生问题。一种解决这个问题的办法就是使用添加额外字符的方法,在使用这个位置参数的变量和位置参数本身的后边全部添加同样的额外字符。
shift命令会重新分配位置参数,其实就是把所有的位置参数都向左移动一个位置。