<返回更多

Shell特殊变量

2023-11-14  微信公众号  Andrew Notes
加入收藏

Shell特殊变量

状态变量

变量 含义 应用场景
$? 上一条命令的返回值 判断命令的执行是否成功
$$ 用于获取当前shell环境的进程ID号 在脚本运行时将pid记录到文件中,方便kill
$! 记录上一个脚本运行的pid,很少用  
$_ 上一个命令或者脚本的最后一个参数 类似于ESC + .

 

$?:用来获取上一个命令或函数的返回值。 (通过返回值,可以进行判断)

##通常命令执行成功返回0,失败返回值为其他数字,比如[root@m01 ~]# cat 1.txtcat: 1.txt: No such file or directory[root@m01 ~]# echo $?1
[root@m01 ~]# ll hvbjhjls: cannot access hvbjhj: No such file or directory[root@m01 ~]# echo $?2         因为ls程序里写了返回值是2
#例:检查域名能否ping通[root@m01 ~]# vim 1.sh#!/bin/bashping -c 1 -w 2 -i 0.1 www.bAIdu.com &>/dev/nullecho $?[root@m01 ~]# sh 1.sh0
##注意:并不是所有命令执行成功都返回0,所以我们在做判断之前,一定要在命令行执行一遍,确认一下。例如[root@localhost ~]# echo 111 > 1.txt[root@localhost ~]# echo 111 > 2.txt[root@localhost ~]# diff 1.txt 2.txt[root@localhost ~]# echo $?   //文件相同时返回00
[root@localhost ~]# echo 222 > 2.txt[root@localhost ~]# diff 1.txt 2.txt1c1< 111---> 222[root@localhost ~]# echo $? //文件不同时返回11

 

$$:可以记录当前脚本运行的pid号,方便kill

# 例1:获取当前shell环境的进程ID号[root@m01 ~]# echo $$37736[root@m01 ~]# pstree -p|grep bash          |-sshd(8565)-+-sshd(20719)---bash(20721)          |           |-sshd(21865)---bash(21867)          |           |-sshd(23197)---bash(23199)          |           |-sshd(37734)---bash(37736)-+-grep(38195)
...
# 例2:记录当前脚本运行的pid号[root@m01 ~]# vim 1.sh#!/bin/bashecho $$sleep 10[root@m01 ~]# sh 1.sh37817[root@m01 ~]# ps -ef|grep 1.shroot      37817  37736  0 22:38 pts/3    00:00:00 sh 1.sh

# 例3:5秒备份一次的脚本,定时任务满足不了#!/bin/bashecho $$ > /var/run/backup.pid     #//记录pid号到/var/run/下while true;do echo '备份中...' cp /etc/passwd /tmp/passwd_$(date +%F-%T) sleep 5done
[root@m01 ~]# sh 1.sh备份中...备份中...备份中...备份中...备份中...
[root@m01 /tmp]# lltotal 540-rw-r--r-- 1 root root 1470 Nov  7 23:08 passwd_2023-11-07-23:08:10-rw-r--r-- 1 root root 1470 Nov  7 23:08 passwd_2023-11-07-23:08:15-rw-r--r-- 1 root root 1470 Nov  7 23:08 passwd_2023-11-07-23:08:20-rw-r--r-- 1 root root 1470 Nov  7 23:08 passwd_2023-11-07-23:08:25...

 

$_

$_:和ESC+.一个效果。记录上一条命令,以空格为分隔符的最后一部分内容。
[root@localhost ~]# ll /etc/passwd-rw-r--r--. 1 root root 906 Oct  9 15:30 /etc/passwd[root@localhost ~]# /etc/passwd   (此处按ESC+.便出来上条的后半部分)

 

位置变量

符号 含义 应用场景
$0 脚本名字 脚本错误提示或者提示帮助时
$n 脚本的第n个参数 传参给脚本,在脚本中使用
$# 统计脚本参数的个数 判断脚本传参个数
$* 接收脚本后所有的参数 将所有参数当成是一个整体,对传递的参数进行判断
$@ 接收脚本后所有的参数 将所有参数当成是一个整体,对传递的参数进行判断

 

$0

# 脚本的帮助/错误提示[root@m01 ~]# /etc/init.d.NETwork     //这个是network的启动脚本Usage: /etc/init.d/network {start|stop|status|restart|force-reload}[root@m01 ~]# /etc/init.d/network startStarting network (via systemctl):                         [ OK ]
# 自己实现脚本的帮助/错误提示[root@m01 ~]# vim 1.sh#!/bin/bashecho $0[root@m01 ~]# sh 1.sh1.sh
[root@m01 ~]# vim 1.sh#!/bin/bashecho "Usage: $0 {start|stop|status|restart|force-reload}"[root@m01 ~]# sh 1.shUsage: 1.sh {start|stop|status|restart|force-reload}
# 脚本完善,使用$#vim usage.sh#!/bin/bashif [ $# -eq 0 ];then echo "Usage: $0 {start|stop|restart}"else echo $1fi
[root@m01 ~]# sh usage.shUsage: usage.sh {start|stop|restart}[root@m01 ~]# sh usage.sh startstart

 

$n:用于给脚本传参

# 运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收。第n个参数,用$n接收
# 例[root@m01 ~]# vim 1.sh#!/bin/bashecho $1 $2 $3 $4 $5
[root@m01 ~]# sh 1.sh 1 2 3 4 51 2 3 4 5[root@m01 ~]# sh 1.sh {1..6}1 2 3 4 5[root@m01 ~]# sh 1.sh {a..h}a b c d e
# $10 以后,需要加{}[root@m01 ~]# vim 1.sh#!/bin/bashecho $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11
[root@m01 ~]# sh 1.sh {a..l}a b c d e f g h i a0 a1[root@m01 ~]# sh 1.sh {1..11}1 2 3 4 5 6 7 8 9 10 11
[root@m01 ~]# vim 1.sh#!/bin/bashecho $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}[root@m01 ~]# sh 1.sh {a..l}a b c d e f g h i j k

 

$#:统计脚本传递了几个参数,让脚本更严谨

# 例#!/bin/bashnum1=$1num2=$2echo $num1echo $num2echo $#
[root@m01 ~]# sh 1.sh 1 2 3 4124

 

$*和$@

$*和$@:接收脚本后面传递的所有参数。主要用于当传递参数较多的情况。正常情况下,这两个变量是没有区别的。用循环的时候才和$@区别
# 例子#!/bin/bashecho $@echo $#[root@m01 ~]# sh 1.sh {a..z}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 z26
#!/bin/bashecho $@echo $*echo $#[root@m01 ~]# sh 1.sh {a..z}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 za b c d e f g h i j k l m n o p q r s t u v w x y z26
## 两者区别:用for循环时$*加了引号变横排,仅此而已[root@m01 ~]# vim 4.sh#!/bin/bashecho '$@输出结果如下:'for num1 in "$@";do echo $num1done
echo '$*输出结果如下:'for num2 in "$*";do     echo $num2done
[root@m01 ~]# sh 4.sh 1 2 3 4 5$@输出结果如下:12345$*输出结果如下:1 2 3 4 5
关键词:Shell      点击(10)
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多Shell相关>>>