shell特殊变量$$等特殊用法

变量说明:

$0

当前Shell脚本的文件名 

$n

添加到Shell的各参数值。$1是第1参数、$2是第2参数…。n为数字1-9,只能表示前9个参数,使用shift命令可以改变这个限制

$$

Shell脚本运行的当前PID(ProcessID),这个变量经常用来构造一个"unique"的临时文件名,通常比调用mktemp来得简单

$!

Shell最后运行的后台Process的PID

$?

显示最后命令的退出状态,0表示没有错误,其他表示有错误

$*

以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超9个。如"\(*"用「"」括起来的情况、以"\)1 \(2 … \)n"的形式输出所有参数。所有的位置参数,被作为一个单词。

注意:"$*"必须被""引用。

$@

传给脚本的所有参数的列表,与$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,并没有被解释和扩展。这也意味着,每个参数列表中的每个参数都被当成一个独立的单词。

注意:"$@"必须被""引用。

$#

传给脚本或函数的参数个数

$-

由当前在Shell中设置的执行标志的名称组成的字符串。

$_

保存之前执行的命令的最后一个参数

#############################################

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

# vi variable

脚本内容如下:

#!/bin/sh

echo "number:$#"

echo "scname:$0"

echo "first :$1"

echo "second:$2"

echo "argume:$@"

保存退出

执行

#./variable aa bb

number:2

scname:./variable

first :aa

second:bb

argume:aa bb

通过显示结果可以看到:

$# 是传给脚本的参数个数

$0 是脚本本身的名字

$1 是传递给该shell脚本的第一个参数

$2 是传递给该shell脚本的第二个参数

$@ 是传给脚本的所有参数的列表

$*和S@的差别

#!/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

从上面结果可以看出:

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

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

验证:

vim test.sh

#!/bin/bash

echo \$0:$0

echo \$1:$1

echo \$2:$2

echo \$#:$#

echo \$*:$*

echo \$@:$@

echo \$?:$?

echo \$$:$$

echo \$!:$!

echo \$-:$-

echo \$_:$_

执行:

./test.sh a b

$0:./test.sh

$1:a

$2:b

$#:2

$*:a b

$@:a b

$?:0

$$:7315

$!:

$-:hB

$_:$-:hB


你可能感兴趣的:($?,$0,$@,$*,$$)