在 Bash 解释器中,内置了许多变量,这些变量的功能是解释器自带的,我们在编写shell脚本时如果能灵活的使用它们,对脚本的编写效率以及差错大有帮助, 下面一一介绍这些变量

$FUNCNAME、$LINENO、$PWD

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

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

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

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

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

  1 #!/bin/bash
2
3
4 testa()
5 {
6 echo 'func='$FUNCNAME,$LINENO
7 }
8
9
10 testa
11
12 echo 'lineno:'$LINENO
13 echo 'xx:'$FUNCNAME
14 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 -u echo 'cur pid:'$$
echo 'parent pid:'$PPID
sleep 20

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

[tt@ecs-centos-7 ~]$ ./a.sh
cur pid:13095
parent 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 CMD
12982 12981 00:00:00 -bash
13095 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/bash

cnt=1
echo 'test 1111' for var in "$*"
do
echo "arg$cnt="$var
let "cnt+=1"
done
echo cnt=1
echo 'test 2222'
for var in $*
do
echo "arg$cnt="$var
let "cnt+=1"
done
echo cnt=1
echo 'test 3333'
for var in "$@"
do
echo "arg$cnt="$var
let "cnt+=1"
done
echo cnt=1
echo "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/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 脚本

#!/bin/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.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/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 内置变量,对于一些生僻或者平常很少用到的变量可以自行查阅相关资料

shell 脚本中常用的内置变量的更多相关文章

  1. 『忘了再学』Shell基础 — 29、AWK内置变量

    目录 1.AWK内置变量 2.练习说明 (1)$n变量练习 (2)FS变量练习 (3)NF变量和NR变量练习 3.总结: 1.AWK内置变量 AWK内置变量如下表: awk内置变量 作用 $0 代表目 ...

  2. nginx应用场景,特性,目录结构,常用模块,内置变量,URL和URI,http状态码,配置文件详解

    1.nginx介绍 1丶俄罗斯人开发的,开源www服务软件 2丶软件一共780K 3丶nginx本身是一款静态(html,js,css,jpg等)www软件 4丶静态小文件高并发,同时占用的资源很少, ...

  3. Perl中的特殊内置变量详解

    #!/usr/bin/perl -w @array = qw(a b c d); foreach (@array) { print $_," "; } 例子的作用就是定义一个数组并 ...

  4. jmeter常用的内置变量

    1. vars   API:http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html vars.get(& ...

  5. shell脚本中常用命令

    1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值. 1.2    ...

  6. 在jsp中常用的内置对象(5个)小总结和两种页面跳转方式(服务器端调转、客户端跳转)的区别

    jsp中常用的几个内置对象: 一.request对象 主要作用:  (1)获取请求页面的信息   比如:request.getParameter("参数名");  (2)获取客户端 ...

  7. beanshell 常用的内置变量与函数

    官方详细文档:https://github.com/beanshell/beanshell/wiki log:用来记录日志文件 log.info("jmeter"); vars - ...

  8. 可以在shell脚本中使用哪些类型的变量?

    在shell脚本,我们可以使用两种类型的变量: 系统定义变量 用户定义变量 系统变量是由系统系统自己创建的.这些变量通常由大写字母组成,可以通过“set”命令查看. 用户变量由系统用户来生成和定义,变 ...

  9. js中常用的内置对象

    Arguments 函数参数集合 arguments[ ] 函数参数的数组 Arguments 一个函数的参数和其他属性 Arguments.callee 当前正在运行的函数     Argument ...

随机推荐

  1. css整理之-----------基本知识

    盒子模型 所有HTML元素可以看作盒子,它包括:边距,边框,填充,和实际内容. CSS中组成一个块级盒子需要: Content box: 这个区域是用来显示内容,大小可以通过设置 width 和 he ...

  2. es6 模块和commonjs规范模块的区别

    相关代码地址:https://github.com/blank-x/blog-code/tree/main/1-module 引入变量 es6 导入变量只是一个符号链接,是个常量,类似于const 声 ...

  3. lucent,solr,ES比较

    |0什么是全文搜索 什么是全文搜索引擎? 百度百科中的定义:全文搜索引擎是目前广泛应用的主流搜索引擎.它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现 ...

  4. 【Azure 服务总线】详解Azure Service Bus SDK中接收消息时设置的maxConcurrentCalls,prefetchCount参数

    (Azure Service Bus服务总线的两大类消息处理方式: 队列Queue和主题Topic) 问题描述 使用Service Bus作为企业消息代理,当有大量的数据堆积再Queue或Topic中 ...

  5. hdu 4622 (hash+“map”)

    题目链接:https://vjudge.net/problem/HDU-4622 题意:给定t组字符串每组m条询问--求问每条询问区间内有多少不同的子串. 题解:把每个询问区间的字符串hash一下存图 ...

  6. python-递归函数和内置函数笔记汇总

    1. def syz(*args)    #    *args  参数组 不必填,不限制参数的个数    参数组不常用 2.def sys2(**kwargs): #关键字参数 3.递归函数,  不常 ...

  7. certutil绕过

    一般进内网过后我都会使用certutil下载文件,但在最近打一台内网机子的时候出现了certutil拒绝访问的情况,在本地搭建了一个环境尝试绕过certutil下载文件. 安装杀软更新到最新版本,开启 ...

  8. python基础之基本数据类型与基本运算符

    一.基本数据类型 1.整数类型 作用:描述年龄.等级,电话号码等数据类型 age = 18 phone_number = 13572839204 2.浮点型 作用:描述薪资.身高等带小数的类型 hei ...

  9. C#委托的学习了解

    C#的委托(Delegate)类似于C\C++的函数指针.委托是存有对某一个方法引用的一种引用变量类型,引用可在运行时被改变. 委托特别用于实现事件和回调方法.所有的委托都派生自System.Dele ...

  10. Dynamics CRM报表提示rsProcessingAborted解决方法

    有时候CRM用的好好的突然报表提示了一个错误,rsProcessingAborted如下图: 开始以为是权限问题,在数据库捣鼓了很长时间,服务也重启了很多遍都没效果.后来试了一下重新安装一下报表服务器 ...