Shell编程-03-Shell中的特殊变量和扩展变量

    在Shell中的特殊变量主要分别两种位置参数变量状态变量两种。

位置参数变量

    Shell中的位置参数变量主要是指$0、$1、$#等,主要用于从命令行、函数或脚本执行等地方传递参数。详细说明如下所示:

$0:获取当前执行的Shell脚本的文件名,如脚本中包含路径,则输出也包括路径

$n:获取当前执行的Shell脚本的第n个参数值,如n>9,则需要使用用大括号,如${10},各参数间用空格进行分隔

$#:获取当前执行的Shell脚本传入参数的总个数

$*:获取当前执行的Shell所有传入参数,如不加引号则与$@功能相同,如果添加双引号**"$*",则表示将所有传入参数视为单个字符串**,相当于"$1 $2 $3"

$@:获取当前执行的Shell所有传入参数,**如不加引号则与$*功能相同,如果添加双引号"$@",则表示将所有传入参数视为独立的字符串**,相当于"$1" "$2" "$3"

当"$*"和"$@"都添加双引号时,两者的功能有所区别;如不加,则功能相同,无区别。

位置参数变量示例

1、示例一:

[root@localhost Test]# cat para.sh #!/bin/bash echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} echo '$0 is:' $0 echo '$1 is:' $1 echo '$12 is:' ${12} echo '$# is:' $# echo '$* is:' $* echo '"$*"is:' "$*" echo '$@ is:' $@ echo '"$@"is:' "$@" # 输出结果 [root@localhost Test]# bash ~/Test/para.sh {a..z} a b c d e f g h i j k l m n o $0 is: /root/Test/para.sh $1 is: a $12 is: l $# is: 26 $* is: a b c d e f g h i j k l m n o p q r s t u v w x y z "$*"is: a b c d e f g h i j k l m n o p q r s t u v w x y z $@ is: a b c d e f g h i j k l m n o p q r s t u v w x y z "$@"is: a b c d e f g h i j k l m n o p q r s t u v w x y z

1、传入的参数个数多于脚本定义的参数时,则多出的参数会忽略
2、传入的参数中如使用双引号,则会当作一个参数值进行传递
3、位置参数如大于9,需要使用${}进行传递

2、示例二:

[root@localhost Test]# cat testposition.sh #!/bin/bash echo '$# $1 $2 $3 $* $@' echo $# $1 $2 $3 $* $@ echo "************" echo '$*' for tmp in $* do echo $tmp done echo "************" echo "@@@@@@@@@@@@" echo '$@' for temp in $@ do echo $temp done echo "@@@@@@@@@@@@" echo '"*"*"*"*"*"*' echo '$*' for i in "$*" do echo $i done echo '"*"*"*"*"*"*' echo '"@"@"@"@"@"@' echo '$@' for j in "$@" do echo $j done echo '"@"@"@"@"@"@' [root@localhost Test]# bash testposition.sh "Hello Jack" Welcome "to Shanghai" $# $1 $2 $3 $* $@ 3 Hello Jack Welcome to Shanghai Hello Jack Welcome to Shanghai Hello Jack Welcome to Shanghai ************ $* # 未加双引号,所以会输出全部参数,则第一个和第三个参数会拆开 Hello Jack Welcome to Shanghai ************ @@@@@@@@@@@@ $@ # 未加双引号,所以会输出全部参数,则第一个和第三个参数会拆开 Hello Jack Welcome to Shanghai @@@@@@@@@@@@ "*"*"*"*"*"* $* # 添加双引号后,传入的参数全部当一个参数进行输出 Hello Jack Welcome to Shanghai "*"*"*"*"*"* "@"@"@"@"@"@ $@ # 添加双引号后,传入的参数全部当独立的参数进行输出 Hello Jack Welcome to Shanghai "@"@"@"@"@"@ 状态变量

$?:获取上一个命令或脚本的执行状态值(0:成功,其他:失败)

$$:获取当前执行的Shell的进程号(PID)

$!:获取上一个在后台工作的进程的进程号

**$_**:获取在些之前执行的命令或脚本的最后一个参数

以上四个状态变量,仅$?常用,其他三个了解即可。

在日常使场景中,$?主要用法如下所示:

1、判断命令和脚本是否执行成功

2、如脚本中调用exit 数字,则会返回该数字给$?

3、如在函数中,则可以通过return 数字将该数字返回给$?

状态变量示例

1、$?示例:

[root@localhost Test]# ll /etc/profile -rw-r--r--. 1 root root 1819 4月 11 2018 /etc/profile [root@localhost Test]# echo $? 0 [root@localhost Test]# ll /etc/profild ls: 无法访问/etc/profild: 没有那个文件或目录 [root@localhost Test]# echo $? 2

2、$$示例:

[root@localhost Test]# cat testPID.sh #!/bin/bash echo $$ > /tmp/test.pid sleep 300 [root@localhost Test]# bash testPID.sh & # 将当前脚本调用到后台执行 [1] 1671 [root@localhost Test]# ps -ef | grep testPID | grep -v grep root 1671 23706 0 16:37 pts/0 00:00:00 bash testPID.sh # 查询PID

3、$!示例:
    $!功能类似于$$,只不过是获取上一次执行脚本的PID

[root@localhost Test]# bash testPID.sh & [1] 24078 [root@localhost Test]# echo $! 24078 # 打印上一次在后台执行的进程号 [root@localhost Test]# ps -ef | grep testPID | grep -v grep root 24078 23706 0 16:42 pts/0 00:00:00 bash testPID.sh

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywzzp.html