shell 脚本中常用的内置变量

108 篇文章 10 订阅
3 篇文章 0 订阅
本文详细介绍了Bash解释器中的内置变量,如FUNCNAME、LINENO、PWD、$$、$PPID等,展示了它们在脚本中的作用,并通过示例说明了如何使用$0-$n、$*$、$@的区别。此外,还讨论了退出状态变量$?和字符串边界处理变量IFS,以及环境变量如$HOME、$USER等。
摘要由CSDN通过智能技术生成

在 Bash 解释器中,内置了许多变量,这些变量的功能是解释器自带的,我们在编写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 -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.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脚本,内容如下

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值