shell的特殊变量

原文:http://blog.csdn.net/imfinger/article/details/6257509

linux中shell变量\(#,\)@,\(0,\)1,$2的含义解释:

变更 说明
$$ Shell本身的PID(ProcessID)
这个变量经常用来构造一个"unique"的临时文件名,通常比调用mktemp 来得简单
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"\(*"用「"」括起来的情况、以"\)1 \(2 … \)n"的形式输出所有参数。
所有的位置参数,被作为一个单词,注意:"$*"必须被""引用。
$@ 与$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,
并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的单词。
注意:"$@"必须被""引用。
$# 添加到Shell的参数个数
$0 Shell本身的文件名
$n 添加到Shell的各参数值。n为数字1-9,只能表示前9个参数,使用shift命令可以改变这个限制
$_ 保存之前执行的命令的最后一个参数

一个简单的脚本,执行以后再解释各个变量的意义:

test.sh

#!/bin/sh

echo "\$*=$*"
echo --------------------------
for n in "$*";do echo $n;done

echo ""
echo "\$@=$@"
echo --------------------------
for n in "$@";do echo $n;done
./test 1 2 3 'asdf $asdfasdf'

$\*=1 2 3 asdf $asdfasdf
--------------------------
1 2 3 asdf $asdfasdf

$@=1 2 3 asdf $asdfasdf
--------------------------
1
2
3
asdf $asdfasdf

从上面结果可以看到:

$*将所有位置参数当做一个字符串输出;

$@将每个位置参数当做独立的元素处理,带空格的参数也当做一个整体。