13.1.6 特殊变量
1.位置参数
Shell中还有一些预先定义的特殊只读变量,它们的值只有在脚本运行时才能确定。首先是“位置参数”,位置参数的命名简单直接,比如,脚本本身为$0,第一个参数为$1,第二个参数为$2,第三个为$3,以此类推。当位置参数的个数大于9时,需要用${}括起来标识,比如说第10个位置参数应该记为${10}。另外,$#表示脚本参数的个数总和,$@或$*表示脚本的所有参数。下面的示例脚本使用了这些特殊的位置参数,请注意不同位置参数的输出。
- [root@localhost ]# cat posion.sh
- #!/bin/bash
- echo "This script's name is: $0"
- echo "$# parameters in total"
- echo "All parameters list as: $@"
- echo "The first parameter is $1"
- echo "The second parameter is $2"
- echo "The third parameter is $3"
- [root@localhost ]# bash posion.sh para1 para2 para3
- This script's name is: posion.sh
- 3 parameters in total
- All parameters list as: para1 para2 para3
- The first parameter is para1
- The second parameter is para2
- The third parameter is para3
2.脚本或命令返回值:$?
在管理员登录到系统中交互式地输入命令时,系统也会及时在屏幕上输出内容给予反馈。比如说本想使用ifconfig查看网卡状态,但是将命令错写成ifconfi,系统会立刻给出command not found的提示,这种提示确实能让管理员感觉到系统非常“友好”。
- [root@localhost ~]# ifconfi
- -bash: ifconfi: command not found
但是有很多后台脚本是需要每天自动运行的,比如每天凌晨两点的数据库备份。在这种情况下一旦出错是不可能在第一时间知道的。那靠什么判断出错了呢?
再考虑一个情景:有些自动备份脚本在按时完成本地数据备份后,还会复制一份放在远程主机上(通过scp就可以做到)。不过在复制前需要先确认远程主机是否“活着”,这可以通过ping远程主机做到。如果能ping通则进行复制,如果ping不通则采取其他动作。这里又如何判断是否ping成功了呢?
这时就需要借助命令的返回值来判断了。Linux中规定正常退出的命令和脚本应该以0作为其返回值,任何非0的返回值都表示命令未正确退出或未正常执行。
在第一个例子中,输错命令后立即查看当时特殊变量$?的值为127;第二个例子中,ping不通某个地址时查看当时的$?值为1。注意,$?永远是上一个命令的返回值,所以要查看某个命令的返回值必须在运行该命令后立即查看$?。在自动化脚本中,也可以通过$?变量的值判断之前命令的执行状态,从而采取不同的动作。
- #
- 输入错误的命令时的返回值
- [root@localhost ~]# ifconfi
- -bash: ifconfi: command not found
- [root@localhost ]# echo $?
- 127
- #
- 尝试ping
- 主机ping
- 不通时的返回值
- [root@localhost ]# ping 192.168.61.100 -c 1
- PING 192.168.61.100 (192.168.61.100) 56(84) bytes of data.
- From 192.168.61.131 icmp_seq=1 Destination Host Unreachable
- --- 192.168.61.100 ping statistics ---
- 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
- [root@localhost ~]# echo $?
- 1