4.4 特殊变量类型
局部变量
仅在代码块或函数中才可见的变量(参考函数章节的局部变量部分)。
环境变量
会影响用户及shell行为的变量。
一般情况下,每一个进程都有自己的“环境”(environment),也就是一组该进程可以访问到的变量。从这个意义上来说,shell表现出与其他进程一样的行为。
每当shell启动时,都会创建出与其环境对应的shell环境变量。改变或增加shell环境变量会使shell更新其自身的环境。子进程(由父进程执行产生)会继承父进程的环境变量。
分配给环境变量的空间是有限的。创建过多环境变量或占用空间过大的环境变量有可能会造成问题。
bash$ eval "`seq 10000 | sed -e 's/.*/export var&=ZZZZZZZZZZZZZZ/'`" bash$ du bash: /usr/bin/du: Argument list too long注意,上面的"错误"已经在Linux内核版本号为2.6.23的系统中修复了。
(感谢 Stéphane Chazelas 对此问题的解释并提供了上面的例子。)
如果在脚本中设置了环境变量,那么这些环境变量需要被“导出”,也就是通知脚本所在的环境做出相应的更新。这个“导出”操作就是 export 命令。
脚本只能将变量导出到子进程,即在这个脚本中所调用的命令或程序。在命令行中调用的脚本不能够将变量回传给命令行环境,即子进程不能将变量回传给父进程。
定义: 子进程(child process)是由另一个进程,即其父进程(parent process)所启动的子程序。
位置参数
从命令行中传递给脚本的参数:$0, $1, $2, $3 ... 即命令行参数。
$0 代表脚本名称,$1 代表第一个参数,$2 代表第二个,$3 代表第三个,以此类推。在 $9 之后的参数必须被包含在大括号中,如 ${10}, ${11}, ${12}。
特殊变量 $* 与 $@ 代表所有位置参数。
样例 4-5. 位置参数
在位置参数中使用大括号助记符提供了一种非常简单的方式来访问传入脚本的最后一个参数。在其中会使用到间接引用。
一些脚本能够根据调用时文件名的不同来执行不同的操作。要达到这样的效果,脚本需要检测 $0,也就是调用时的文件名。同时,也必须存在指向这个脚本所有别名的符号链接文件(symbolic links)。详情查看样例 16-2。
如果一个脚本需要一个命令行参数但是在调用的时候却没有传入,那么这将会造成一个空变量赋值。这通常不是我们想要的。一种避免的方法是,在使用期望的位置参数时候,在赋值语句两侧添加一个额外的字符。
样例 4-6. wh, whois 域名查询
使用 shift 命令可以将全体位置参数向左移一位, 重新赋值。
$1 <--- $2, $2 <--- $3, $3 <--- $4,以此类推。
原先的 $1 将会消失,而 $0(脚本名称)不会有任何改变。如果你在脚本中使用了大量的位置参数,shift 可以让你不使用{大括号}助记法也可以访问超过10个的位置参数。
样例 4-7. 使用 shift 命令
shift 命令也可以带一个参数来指明一次移动多少位。
使用
shift命令同给函数传参相类似。详情查看样例 36-18。
Last updated
Was this helpful?
