shell中$0 $n $# $* $@ $? $$ $! $_ 特殊变量之间的区别

特殊位置变量
符号含义应用
$0脚本的名字出现故障提示 使用帮助 一般与$#
$n脚本的第几个参数桥梁(命令行 传递到 脚 本中) /etc/init.d/network start
$#脚本中参数的个数 判断参数个数是否正常
$*取出所有的参数 加上双引号:相当于是 1个整体 1个参数循环或数组
$@取出所有的参数 加上双引号:就是每个 都是独立循环或数组

 

特殊变量之状态
符号含义应用
$?上一条命令的返回值 0 正常 非0 失败上一条命令的返回值 0 正常 非0 失败
判断各种东西执行是否成功
$$当前运行脚本的pid在脚本中把pid记录到文件 方便后面 进行 kill
$!上一个运行的脚本的pid
$_上1个命令或脚本的后1个参数 esc + ._(下划线)环境变量

 

$0:
一般用来 在脚本执行错误的时候(参数写错 不对) 给用户进行提示 
[root@m01 /server/scripts]# cat     show.sh 
#!/bin/bash 
echo "Usage: $0 {start|stop|restart}" 

[root@m01 /server/scripts]# sh show.sh 
Usage: show.sh {start|stop|restart} 

[root@m01 /server/scripts]# sh /server/scripts/show.sh 
Usage: /server/scripts/show.sh {start|stop|restart}

[root@m01 /server/scripts]# /etc/init.d/network  oldboy 
Usage: /etc/init.d/network {start|stop|status|restart|forcereload} 

[root@m01 /server/scripts]# # echo "Usage: $0 {start|stop|status|restart|force-reload}"

 

$n :
n是数字脚本的 命令行中的内容 传递到脚本中 /etc/init.d/network restart
[root@m01 /server/scripts]# cat show.sh 
#!/bin/bash
echo "Usage: $0 {start|stop|restart}" 
echo "$1 $2 $3" 

[root@m01 /server/scripts]# sh  show.sh a b c 
Usage: show.sh {start|stop|restart} 
a b c

注意:$n n超过9 从10开始 需要使用 ${10}

补充:

sed 中 &符号
vim中进行替换
:s#[0-9]+#{&}#g #替换当前行 .
:%s#[0-9]+#{&}#g #%文件中所有行
:1,$s###g

 

$#:
脚本参数的个数
应用场景: 参数个数等于0 则显示错误提示
[root@m01 /server/scripts]# cat show.sh 
#!/bin/bash 
#echo "Usage: $0 {start|stop|restart}" 
#echo ${1} ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9} ${10} ${11} ${12} ${13} ${14} ${15}
if [ $# -eq 0 ];then 
echo "Usage: $0  {start|stop|restart}" 
fi 

[root@m01 /server/scripts]# sh  show.sh 
Usage: show.sh  {start|stop|restart}

 

$* 和 $@
符号共同区别
$*取出所有参数双引号: 1个参数 1个整体
$@取出所有参数双引号: 每个参数独立
测试脚本内容
#!/bin/bash
echo 没有加引号
for n in $*
do
 echo "<$n>"
done

for i in $@
do
 echo "<$i>"
done

echo 加引号
for n in "$*"
do
 echo "<$n>"
done

for i in "$@"
do
 echo "<$i>"
done
测试 加上双引号与不加双引号后的特点
例子一:
[root@sun ~]#sh test.sh a b c
没有加引号
<a>
<b>
<c>
<a>
<b>
<c>
加引号
<a b c>
<a>
<b>
<c>


例子二:
[root@sun ~]#sh test.sh "i  am"  man
没有加引号
<i>
<am>
<man>
<i>
<am>
<man>
加引号
<i  am man>
<i  am>
<man>

 

$?:
1.检查命令 ping
[root@m01 scripts]# ping -c3 -W1 -i1 10.0.0.6 
PING 10.0.0.6 (10.0.0.6) 56(84) bytes of data.

--- 10.0.0.6 ping statistics --
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

[root@m01 scripts]# echo $? 
1
2.工作完成任务
#systemctl restart network === /etc/init.d/network restart     
CWD=$(pwd)    
cd "$CWD"    
$0 stop    
$0 start    
rc=$?     #把命令返回值记录  方便后期排错     
exit $rc  #退出脚本 并返回 $rc里面数值(返回值) 脚本的返回值.

 

$$:
用于记录脚本的PID号码 方便进行kill 或查询状态
tee 配合管道 信息输出到屏幕 信息写入到文件 sh pang.sh & #让脚本进入后台运行
脚本中记录脚本的pid号码 写入到文件中 后面可以方便查看或根据pid结束进程
[root@sun ~]#cat test.sh 
#!/bin/bash
echo $$ |tee /tmp/sleep.pid
sleep 3000

[root@sun ~]#sh test.sh &
[1] 21938
[root@sun ~]#21938
[root@sun ~]#cat /tmp/sleep.pid
21938

[root@sun ~]#kill `cat /tmp/sleep.pid`
[root@sun ~]#kill `cat /tmp/sleep.pid`
-bash: kill: (21938) - No such process
[1]+  Terminated              sh test.sh

 

赞赏

微信赞赏支付宝赞赏

Shell

linux中 单引号 双引号 无引号 反引号之间的区别

2019-10-29 8:02:16

Shell

使用shell脚本记录用户操作

2019-11-1 8:17:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索