Shell变量_特殊变量
特殊变量
shell的特殊变量,用在如脚本,函数传递参数使用,有如下的特殊的,位置参数变量
- $0 获取shell脚本文件名,以及脚本路径
- $n 获取shell脚本的第n个参数,n在1-9之间,如$1,$9,大于9则需要加大括号 ${10},参数空格隔开
- $# 获取执行的shell脚本后面的参数总个数
- $* 获取shell脚本所有参数,加上引号“$*”作为一个整体,
- $@ 获取shell脚本所有参数作 把每个参数区分对待,
2 #
3 #
4 #author cread by Mrxu
5 #function 特殊变量位置参数举例
6 echo "你录入的参数总个数$#"
7 echo ‘'参数列表以$@接受'
8 for var in $@
9 do
10 echo "$var"
11 done
12 echo ‘'参数列表以$*接受'
13 for var in $*
14 do
15 echo "$var"
16 done
17 echo ‘'参数列表以"$@"接受'
18 for var in "$@"
19 do
20 echo "$var"
21 done
22 echo ‘'参数列表以"$*"接受'
23 for var in "$*"
24 do
25 echo "$var"
26 done
[root@localhost tmp]# sh MyVar.sh 1 2 3
你录入的参数总个数3
‘参数列表以$@接受
1
2
3
‘参数列表以$*接受
1
2
3
‘参数列表以"$@"接受
1
2
3
‘参数列表以"$*"接受
1 2 3
[root@localhost tmp]#
注意:$*和$@的区别
当$*和$@不被引号""时,他们之间没区别,都是将接收的参数看着一份数据,彼此以空格分隔
但是当他们被""时,就存在区别
"$*" 会将所有的参数从整体上看做一份数据,
"$@"任然将每个参数都看着一份数据,彼此独立
特殊状态变量
-
$? 上一次命令执行状态返回值, 0正确,非0失败
-
$! 上一次 后台的进程pid
-
$_ 在此之前执行的命令,最后一个参数
-
$$ 当前shell 进程号pid
#查看帮助文档特殊变量 通过man 手册查询
[root@localhost ~]# man bash
/Speical Parameters #搜索关键字
脚本控制返回值的玩法,脚本返回值,学习shell函数编程之后,才能彻底立即。这个脚本执行完毕了,会返回一个数字id,称为返回值。
#案例:$#和$?案例 脚本控制返回值的玩法1.
[root@localhost tmp]# vim demo1.sh
#!/bin/bash
[ $# -ne 2 ] && {
echo "请传入正确的参数个数!"
exit 119 #终止程序允许,且返回119状态玛,提供给当前shell的$?变量,若函数里可以return 119
}
echo "传入参数个数ok!"
######执行
[root@localhost tmp]# sh demo1.sh 2 5 6
请传入正确的参数个数!
[root@localhost tmp]# $?
bash: 119: 未找到命令...
[root@localhost tmp]# sh demo1.sh 2 5
传入参数个数ok!
[root@localhost tmp]# $?
bash: 0: 未找到命令...
##案例2:
[root@localhost tmp]# nohup ping www.baidu.com & 1> /dev/null
[1] 4027
[root@localhost tmp]# nohup: 忽略输入并把输出追加到"nohup.out"
ps -ef|grep ping
root 2376 1987 0 14:32 ? 00:00:00 /usr/libexec/gsd-housekeeping
root 4027 2894 0 15:31 pts/0 00:00:00 ping www.baidu.com
root 4035 2894 0 15:31 pts/0 00:00:00 grep --color=auto ping
[root@localhost tmp]# echo $!
4027
[root@localhost tmp]#
###案例3:$$当前进程编号;由下案例也可看出来,用.和sourc是用的当前shell,相当/觉得路径和sh调用脚本都是另开一个新的shell进程
#!/bin/bash
[ $# -ne 2 ] && {
echo "请传入正确的参数个数!"
exit 119 #终止程序允许,且返回119状态玛,提供给当前shell的$?变量,若函数里可以return 119
}
echo "传入参数个数ok!"
echo "当前的脚本id是:$$"
[root@localhost tmp]#
[root@localhost tmp]# sh demo1.sh 3 3
传入参数个数ok!
当前的脚本id是:4316
[root@localhost tmp]# echo $$
2894
[root@localhost tmp]# . demo1.sh 3 3
传入参数个数ok!
当前的脚本id是:2894
[root@localhost tmp]# source demo1.sh 3 3
传入参数个数ok!
当前的脚本id是:2894
[root@localhost tmp]# pwd
/root/tmp
[root@localhost tmp]# /root/tmp/demo1.sh 3 3
传入参数个数ok!
当前的脚本id是:4378
[root@localhost tmp]# sh demo1.sh 3 3
传入参数个数ok!
当前的脚本id是:4395
[root@localhost tmp]# sh demo1.sh 3 5 6
请传入正确的参数个数
[root@localhost tmp]# echo $_
6
[root@localhost tmp]#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!