文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

shell 脚本中有哪些常用的内置变量

2023-06-15 01:32

关注

这篇文章给大家介绍shell 脚本中有哪些常用的内置变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

$FUNCNAME、$LINENO、$PWD

FUNCNAMELINENO 变量经常用于脚本的调试

FUNCNAME 表示当前函数的名字,作用范围仅限函数中使用,在函数外无值

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

PWD 表示当前目录, 对应于 pwd命令

现有个脚本 a.sh 内容如下

#!/bin/bash   testa()  {    echo 'func='$FUNCNAME,$LINENO   }  testa   echo 'lineno:'$LINENO  echo 'xx:'$FUNCNAME  echo 'curpath:'$PWD

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

[tt@ecs-centos-7 ~]$ ./a.sh
func=testa,6
lineno:12
xx:
curpath:/home/tt

testa 函数中 FUNCNAME 变量值是 testa,也即函数名字,在函数外部无值

LINENO 变量无论是在函数中还是函数外,都表示当前所在的行号

$$、$PPID

这两个变量依次表示当前进程ID和父进程ID

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

sleep 20 睡眠语句是为了让执行脚本进程暂缓退出,在另一个终端中验证输出的结果

#!/bin/bash#set -uecho 'cur pid:'$$echo 'parent pid:'$PPIDsleep 20

在当前终端执行 ./a.sh,结果如下

[tt@ecs-centos-7 ~]$ ./a.sh cur pid:13095parent pid:12982

在执行a.sh的脚本进程退出之前,打开另一个终端,执行 ps -o pid,ppid,time,cmd -p 12982,13095 命令,结果如下

[tt@ecs-centos-7 ~]$ ps -o pid,ppid,time,cmd -p 12982,13095  PID  PPID     TIME CMD12982 12981 00:00:00 -bash13095 12982 00:00:00 /bin/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, 内容如下

#!/bin/bashcnt=1echo 'test 1111'for var in "$*"do   echo "arg$cnt="$var   let "cnt+=1"doneechocnt=1echo 'test 2222'for var in $*do  echo "arg$cnt="$var  let "cnt+=1"doneechocnt=1echo 'test 3333'for var in "$@"do  echo "arg$cnt="$var  let "cnt+=1"doneechocnt=1echo "test 4444"for var in $@do echo "arg$cnt="$var let "cnt+=1"done

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

[root@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.shf.sh 测试脚本

e.sh 脚本

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

f.sh 脚本

#!/bin/bashsh e.sh test_func 3echo 'exit code1:'$?sh e.sh test_func 10echo 'exit code2:'$?test -f $PWD/xx.txtecho 'exit code3:'$?test -f $PWD/e.shecho 'exit code4:'$?

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

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

脚本 e.shtest_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脚本,内容如下

#!/bin/bashva="a:b:c"vb="x-y-z"vc="e,f,g"IFS=":"echo 'va:'$vaecho 'vb:'$vbecho 'vc:'$vcechoIFS="-"echo 'va:'$vaecho 'vb:'$vbecho 'vc:'$vcechoIFS=","echo 'va:'$vaecho 'vb:'$vbecho '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:    当前用户IDGROUPS: 当前用户组ID
[tt@ecs-centos-7 ~]$ echo $HOME/home/tt[tt@ecs-centos-7 ~]$ echo $USERtt[tt@ecs-centos-7 ~]$ echo $UID1003[tt@ecs-centos-7 ~]$ echo $GROUPS1003

$HOSTTYPE、$MACTYPE、$OSTYPE

这些变量都表示系统硬件

[tt@ecs-centos-7 ~]$ echo $HOSTTYPEx86_64[tt@ecs-centos-7 ~]$ echo $MACHTYPEx86_64-redhat-linux-gnu[tt@ecs-centos-7 ~]$ echo $OSTYPElinux-gnu

关于shell 脚本中有哪些常用的内置变量就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯