shell变量之辨[11]

[其他的特殊变量]

$!  在后台运行的最后的工作的 PID(进程ID)  test15
$_  之前执行的命令中最后一个参数  test16
$?  命令,函数或者脚本本身的退出状态  test17
范围:  0-255
$$  脚本自身的进程 ID  test18
test15~18, 分别代码如下:
test15:
#!/bin/bash
CMD="sleep 10"
echo "PID: $!"
${CMD} &
echo "PID: $!"

运行结果为:

./test15.sh
PID:
PID: 31670

可以看到, 如果没有将sleep命令放到后台执行, 那么$!也不会有任何的赋值

test16:

#!/bin/bash
echo $_
du > /dev/null
echo $_
ls -al > /dev/null
echo $_
:
echo $_
输出结果是:
/bin/bash
du
-al
:
test17:
#!/bin/bash
ls -l > /dev/null
echo $?
ls -l /xx > /dev/null 2>&1
echo $?

function func()
{
        return $1
}
for i in 0 -1 255 256 -255 -256
do
        echo -n "$i: ";
        func $i
        echo $?
done

$?是我们最常用的一个特殊变量, 一般我们用return来给函数赋返回值, 或者在单独的脚本中, 使用exit命令亦可. 上面的脚本运行结果如下:

0
1
0: 0
-1: 255
255: 255
256: 0
-255: 1
-256: 0

由此我们也可以看出, 返回值的范围是0-255, 如果超出范围, 也自然会映射到这个范围内

test18:

#! /bin/bash
echo "I am father $$";
echo -n "1: "
./18.sh
echo -n "2: "
(./18.sh)
echo -n "3: "
source ./18.sh
echo -n "4: "
. ./18.sh

其中18.sh的内容为:

#! /bin/bash
echo "Who am I: [$0] $$"

运行test18的结果为:

I am father 32484
1: Who am I: [./18.sh] 32485
2: Who am I: [./18.sh] 32486
3: Who am I: [./test18.sh] 32484
4: Who am I: [./test18.sh] 32484

这样我们可以看到1,2均是子进程的方式运行, 而3,4都继续沿用了父进程的process id

本文链接:https://www.poisonbian.com/post/887.html 转载需授权!

分享到:
原文链接:,转发请注明来源!
「shell变量之辨[11]」评论列表

发表评论