shell的特殊变量

  • 特殊变量
    特殊变量包括位置参数变量状态变量两种。

  • 位置参数变量
    Shell中的位置参数变量主要是指0、0、1、$#等,主要用于从命令行、函数或脚本执行等地方传递参数。详情如下:
    a、$0:获取当前执行的Shell脚本的文件名,如脚本中包含路径,则输出也包括路径

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

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

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

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

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

示例:

[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
  • 位置参数变量$*和$@区别:

a、$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。

b、但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n " 的 形 式 输 出 所 有 参 数 ; " n"的形式输出所有参数;" n""@" 会将各个参数分开,以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数

示例:

#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done

输出:

$*=  a b c d
"$*"= a b c d
$@=  a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d
  • 状态变量

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

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

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

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

以上的状态变量只有$?最常用,其他的了解即可;

$?的主要用法:

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

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

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

$?示例:

[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

$$示例:

[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

$!示例:

[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

$_示例:

[root@localhost Test]# bash para.sh {a..z}
a b c d e f g h i j k l m n o
$0  is: 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
[root@localhost Test]# echo $_
z # 打印最后一个传入的参数值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值