13.1.6 特殊变量

1.位置参数

Shell中还有一些预先定义的特殊只读变量,它们的值只有在脚本运行时才能确定。首先是“位置参数”,位置参数的命名简单直接,比如,脚本本身为$0,第一个参数为$1,第二个参数为$2,第三个为$3,以此类推。当位置参数的个数大于9时,需要用${}括起来标识,比如说第10个位置参数应该记为${10}。另外,$#表示脚本参数的个数总和,$@或$*表示脚本的所有参数。下面的示例脚本使用了这些特殊的位置参数,请注意不同位置参数的输出。


  1. [root@localhost ]# cat posion.sh
  2. #!/bin/bash
  3. echo "This script's name is: $0"
  4. echo "$# parameters in total"
  5. echo "All parameters list as: $@"
  6. echo "The first parameter is $1"
  7. echo "The second parameter is $2"
  8. echo "The third parameter is $3"
  9. [root@localhost ]# bash posion.sh para1 para2 para3
  10. This script's name is: posion.sh
  11. 3 parameters in total
  12. All parameters list as: para1 para2 para3
  13. The first parameter is para1
  14. The second parameter is para2
  15. The third parameter is para3

2.脚本或命令返回值:$?

在管理员登录到系统中交互式地输入命令时,系统也会及时在屏幕上输出内容给予反馈。比如说本想使用ifconfig查看网卡状态,但是将命令错写成ifconfi,系统会立刻给出command not found的提示,这种提示确实能让管理员感觉到系统非常“友好”。


  1. [root@localhost ~]# ifconfi
  2. -bash: ifconfi: command not found

但是有很多后台脚本是需要每天自动运行的,比如每天凌晨两点的数据库备份。在这种情况下一旦出错是不可能在第一时间知道的。那靠什么判断出错了呢?

再考虑一个情景:有些自动备份脚本在按时完成本地数据备份后,还会复制一份放在远程主机上(通过scp就可以做到)。不过在复制前需要先确认远程主机是否“活着”,这可以通过ping远程主机做到。如果能ping通则进行复制,如果ping不通则采取其他动作。这里又如何判断是否ping成功了呢?

这时就需要借助命令的返回值来判断了。Linux中规定正常退出的命令和脚本应该以0作为其返回值,任何非0的返回值都表示命令未正确退出或未正常执行。

在第一个例子中,输错命令后立即查看当时特殊变量$?的值为127;第二个例子中,ping不通某个地址时查看当时的$?值为1。注意,$?永远是上一个命令的返回值,所以要查看某个命令的返回值必须在运行该命令后立即查看$?。在自动化脚本中,也可以通过$?变量的值判断之前命令的执行状态,从而采取不同的动作。


  1. #
  2. 输入错误的命令时的返回值
  3. [root@localhost ~]# ifconfi
  4. -bash: ifconfi: command not found
  5. [root@localhost ]# echo $?
  6. 127
  7. #
  8. 尝试ping
  9. 主机ping
  10. 不通时的返回值
  11. [root@localhost ]# ping 192.168.61.100 -c 1
  12. PING 192.168.61.100 (192.168.61.100) 56(84) bytes of data.
  13. From 192.168.61.131 icmp_seq=1 Destination Host Unreachable
  14. --- 192.168.61.100 ping statistics ---
  15. 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
  16. [root@localhost ~]# echo $?
  17. 1