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

$# 获取当前shell命令中参数的总个数

$$ 获取当前shell的进程号(PID)

$!  执行上一个指令的PID

$0 获取当前执行的shell脚本的文件名

$n 获取当前执行的shell脚本的第n个参数值,n=1..9.

$* 获取当前shell的所以参数$1 $2 $3 ....注意与$#的区别 ,是将所有的命令行所有参数视为单个字符,等同于“$1$2$3”

$$获取当前shell的命令行中的参数总个数

$! 执行上一个指令的PID

$@ 这个程序的所有参数,是将所有命令行每个参数视为单独的字符串,等同于"$1" "$2" "$3",这是将参数传递给其他的程序的最佳方式,因为他会保留所有内嵌每个参数里的任何空白。

$_ 在此之前执行的命令或者脚本的最后一个参数

在脚本调用,一般用exit 0或者函数return 0.

#?

返回值:

0          表示成功

2          表示权限拒绝

1~25   表示运行失败,脚本命令、系统命令错误或者参数传递错误。

126     找到该命令了,但是无法执行

127     未找到要运行的命令。

>128  命令被系统强制结束

$$

[root@PXE shell_scrpit]# cat 2.sh
echo $$ >/1.log
while true
do
     uptime
     sleep 2
done
echo $$ >2.1log

[root@PXE shell_scrpit]# sh 2.sh &
[1] 21525
[root@PXE shell_scrpit]#  21:31:16 up 1 day,  6:31,  5 users,  load average: 0.05, 0.02, 0.00

[root@PXE /]# cat 1.log  #此时可以看出当前的进程号也就是2.sh
21525
You have new mail in /var/spool/mail/root
[root@PXE /]# kill 21525 #直接杀死进程号

[root@PXE shell_scrpit]# cat all.sh 

echo  '$0 获取当前执行的shell脚本的文件名:'                                       $0

echo  '$n 获取当前执行的shell脚本的第n个参数值,n=1..9:'             '$1'=$1 '$2'=$2 '$3'=$3

echo  '$* 获取当前shell的所以参数$1 $2 $3 ....注意与$#的区别:'       $*

echo  '$$获取当前shell的命令行中的参数总个数:'                                 $#

sleep 2 &  

echo  '$! 执行上一个指令的PID:'                                                             $!

echo  '$@ 这个程序的所有参数:'                                                            $@

echo  '$_ 在此之前执行的命令或者脚本的最后一个参数:'                     $_

[root@PXE shell_scrpit]# sh all.sh cmz leco icpc

$0 获取当前执行的shell脚本的文件名: all.sh

$n 获取当前执行的shell脚本的第n个参数值,n=1..9: $1=cmz $2=leco $3=icpc

$* 获取当前shell的所以参数$1 $2 $3 ....注意与$#的区别: cmz leco icpc

$$获取当前shell的命令行中的参数总个数: 3

$! 执行上一个指令的PID: 21937

$@ 这个程序的所有参数: cmz leco icpc

$_ 在此之前执行的命令或者脚本的最后一个参数: icpc

[root@PXE shell_scrpit]# set -- "I am" a boy.
You have new mail in /var/spool/mail/root
[root@PXE shell_scrpit]# echo #*

[root@PXE shell_scrpit]# echo $#
3


[root@PXE shell_scrpit]# for i in $@;do echo $i;done
I
am
a
boy.
[root@PXE shell_scrpit]# for i in $*;do echo $i;done  #
I
am
a
boy.

[root@PXE shell_scrpit]# for i;do echo $i;done  #去掉 in 变量列表。相当于in “$@” 
I am
a
boy.
[root@PXE shell_scrpit]# for i in "$@";do echo $i;done

#在没有双引号的情况下。参数里引号内容当做一个参数输出,这才真正符合我们传入参数的需求。set -- "I am" a boy。
I am
a
boy.
[root@PXE shell_scrpit]# for i in "$*";do echo $i;done

#技术了双引号,$*表示一个字符串
I am a boy.


你可能感兴趣的:(shell)