首页 > 编程知识 正文

shell脚本查看变量类型(linux shell脚本)

时间:2023-05-04 23:31:38 阅读:103273 作者:4644

在Bash解释器中,有许多内置变量。这些变量的功能是解释器自己的。如果能在编写shell脚本时灵活运用,对脚本编写效率和错误有很大帮助。下面逐一介绍这些变量。

$FUNCNAME、$LINENO、$PWD

FUNCNAME和LINENO变量常用于调试脚本。

FUNCNAME表示当前函数的名称。它的作用域只在函数中使用,在函数外没有值。

LINENO表示变量在当前脚本中出现的行号。

PWD代表当前目录,对应pwd命令。

现有的脚本如下

1 #!/ssdsh/bash

2

4 testa()

5 {

6回显' func='$FUNCNAME,$LINENO

7 }

10遗嘱

11

12回声' lineno:'$LINENO

13回显' xx:'$FUNCNAME

14 echo 'curpath:'$PWD

执行。/a.sh命令,输出如下

[tt@ecs-centos-7 ~]$。/a.sh

func=testa,6

lineno:12

xx:

curpath :/住宅/tt

在testa函数中,FUNCNAME的变量值是testa,即函数名,在函数外没有任何值。

no变量,无论是在函数内还是函数外,都表示当前的LINENO数。

两个变量

$、$PPID

依次表示当前进程标识和父进程标识。

现有的a.sh脚本,内容如下

sleep 20 sleep语句的目的是暂停脚本执行过程的退出,并在另一个终端验证输出结果。

#!/ssdsh/bash

#set -u

echo 'cur pid:'$

echo 'parent pid:'$PPID

睡眠20

执行。/a.sh,结果如下

[tt@ecs-centos-7 ~]$。/a.sh

卷曲皮:13095

父pid:12982

在执行a.sh的脚本进程退出之前,打开另一个终端,执行命令PS-O PID、PPID、时间、CMD-P12982、13095。结果如下

[tt@ecs-centos-7 ~]$ ps -o pid,ppid,time,cmd -p 12982,13095

PPID时间

12982 12981 00:00:00-bash

13095 12982 00:00:00/ssdsh/bash。/a.sh

从上面的结果可以看出,在执行。/a.sh命令中,$变量表示执行a.sh脚本的进程ID 13095,12982是其父进程ID,即PPID变量的值,它是当前bash的一个实例。

$0,$1,$2...$n、$#

$#表示从命令行传递到脚本中的参数数量。

$0,$1,$2.$n是从命令行传递给脚本的参数$0是脚本本身的名称$1是第一个参数$2是第二个参数,以此类推$n是第n个参数。

第十个和后续参数必须用大括号括起来,例如, ${10}、${11}和${12}依次表示第十个、第十一个和第十二个变量。

$*、$@

都代表位置参数,但它们之间有一些区别。

当使用$ *时,如果加上双引号,即' $ * ',所有位置的参数将被视为一个单词;如果不包含双引号,即$ *,每个位置的参数将被视为一个独立的单词。

对于$ @,无论是否添加双引号,每个位置的参数都被视为一个独立的单词。

现有c.sh,内容如下

#!/ssdsh/bash

cnt=1

回声'测试1111 '

对于“$*”中的变量

echo 'arg$cnt='$var

让“cnt=1”

完成的

回声

cnt=1

回声'测试2222 '

对于以$*表示的风险值

echo 'arg$cnt='$var

让“cnt=1”

完成的

回声

cnt=1

回声'测试3333 '

对于“$@”中的var

echo 'arg$cnt='$var

让“cnt=1”

完成的

回声

cnt=1

回声'测试4444 '

对于$@中的var

echo 'arg$cnt='$var

让“cnt=1”

完成的

执行。/c.sh 1 2 3,结果如下

[r

oot@ecs-centos-7 ~]# ./c.sh 1 2 3 test 1111 arg1=1 2 3 test 2222 arg1=1 arg2=2 arg3=3 test 3333 arg1=1 arg2=2 arg3=3 test 4444 arg1=1 arg2=2 arg3=3

从上面的结果可以看出,对于 $* 来说,加了双引号之后所有位置参数就会被视为一个单词

对于 $@ 来说,是否加双引号,结果都是一样的

所以,仅在使用双引号时,$*和 $@ 才会有差异

$?

命令、函数或者脚本的退出状态,在判断命令的执行结果或者函数的调用结果时很有用处

现有 e.sh 和 f.sh 测试脚本

e.sh 脚本

#!/ssdsh/bash test_func() { if [[ $1 -eq 10 ]]; then return 5 fi return 6 } if [ $# -ge 1 ]; then name="$1" shift 1 $name "$@" fi

f.sh 脚本

#!/ssdsh/bash sh e.sh test_func 3 echo 'exit code1:'$? sh e.sh test_func 10 echo 'exit code2:'$? test -f $PWD/xx.txt echo 'exit code3:'$? test -f $PWD/e.sh echo 'exit code4:'$?

执行 ./f.sh 命令,结果如下

[root@ecs-centos-7 ~]# ./f.sh exit code1:6 exit code2:5 exit code3:1 exit code4:0

脚本 e.sh 中 test_func 函数功能是:当参数等于10时,退出状态为 5,否则为 6

sh e.sh test_func 3 命令会调用 e.sh 脚本中的 test_func函数,传入参数是 3,所以退出状态为 6,同理可知, sh e.sh test_func 10 命令的退出状态是 5

在Linux中,命令执行成功,退出状态为 0 ,失败则为非 0

test -f $PWD/xx.txt 命令是检查当前目录是否存在 xx.txt 文件,因当前目录并不存在 xx.txt,所以命令执行失败,退出状态为非 0

由于e.sh 存在于当前目录下,所以 test -f $PWD/e.sh 命令执行成功,退出状态为 0

$IFS

此变量用于 Bash 识别字符串或单词边界,默认值是空格,脚本中根据需要可以修改此变量的值

现有 b.sh脚本,内容如下

#!/ssdsh/bash va="a:b:c" vb="x-y-z" vc="e,f,g" IFS=":" echo 'va:'$va echo 'vb:'$vb echo 'vc:'$vc echo IFS="-" echo 'va:'$va echo 'vb:'$vb echo 'vc:'$vc echo IFS="," echo 'va:'$va echo 'vb:'$vb echo 'vc:'$vc

执行 ./b.sh 结果如下

[tt@ecs-centos-7 ~]$ ./b.sh va:a b c vb:x-y-z vc:e,f,g va:a:b:c vb:x y z vc:e,f,g va:a:b:c vb:x-y-z vc:e f g

从结果可以看出,当 $IFS 为 : 时,字符串 "a:b:c"被解析成 a b c

当 $IFS 为 - 时,字符串 "x-y-z"被解析成 x y z

当 $IFS 为 , 时,字符串 "e,f,g"被解析成 e f g

$HOME、$USER、$UID、$GROUPS

HOME: 用户home目录 USER: 当前用户名 UID: 当前用户ID GROUPS: 当前用户组ID [tt@ecs-centos-7 ~]$ echo $HOME /home/tt [tt@ecs-centos-7 ~]$ echo $USER tt [tt@ecs-centos-7 ~]$ echo $UID 1003 [tt@ecs-centos-7 ~]$ echo $GROUPS 1003

$HOSTTYPE、$MACTYPE、$OSTYPE

这些变量都表示系统硬件

[tt@ecs-centos-7 ~]$ echo $HOSTTYPE x86_64 [tt@ecs-centos-7 ~]$ echo $MACHTYPE x86_64-redhat-linux-gnu [tt@ecs-centos-7 ~]$ echo $OSTYPE linux-gnu

小结

本文介绍了一些常用的 Bash 内置变量,对于一些生僻或者平常很少用到的变量可以自行查阅相关资料

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。