Linux的命令可以带有参数,例如ls -al可以查看包含隐藏文件的所有属性与权限。那么shell script能不能在脚本文件名后面带有参数呢。举例子:重启系统注册表文件的功能:
上面的命令可以重新启动/etc/init.d/network这个程序。如果在其后面加个stop呢,很明显,就可以直接关闭该服务了!
如果想要依据程序的执行给予一些变量去进行不同的任务时(虽然可以使用read命令,但是需要手动键盘输入一些判断式),就可以通过命令后面接参数,那么一个命令就能够处理完毕而不需要手动再次输入一些变量行为!这样执行命令会比较简单方便。
script怎样实现这个功能呢?script针对参数已经有设置好一些变量名称了!对应如下:
/path/to/scriptname | opt1 | opt2 | opt3 | opt4 |
$0 | $1 | $2 | $3 | $4 |
执行脚本文件名为$0这个变量,第一个接的参数就是$1。因此只要合理在script里面善用$1,就可以很简单地立即执行某些命令功能了!除了这些数字的变量之外,还有一些比较特殊的变量可以在script内使用来调用这些参数。
- $#:代表后面接的参数的“个数"
- $@:代表“$1”,"$2","$3","$4"之意,每个变量都是独立的(用引号括起来)
- $*:代表“"$1c$2c$3c$4"”,其中c为分隔符,默认为空格键,所以本例中代表“"$1 $2 $3 $4"”之意
上面的$@和$*基本上还是有所不同的。不过,一般使用情况下可以直接记为$@就可以!
栗子:假设要执行一个携带参数的script,执行该脚本后屏幕会显示如下的数据:
- 程序的文件名
- 共有几个参数
- 若参数的个数小于2则告知用户参数数量太少
- 全部的参数内容
- 第一个参数
- 第二个参数
#!/bin/bash
# Program:
# Program shows the secript name,parameters...
# History:
# 2018/11/25 steve First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "The script name is ==> $0"
echo "Total paramter number is ==> $#"
[ "$#" -lt 2 ] && echo "The number of number paramter is less than 2. Stop here." \ && exit 0
echo "Your whole parameter is ==> '$@'"
echo "The 1st parameter ==> $1"
echo "The 2nd parameter ==> $2"
执行结果如下:
- shift:造成参数变量号码偏移
- 除此之外,脚本后面所接的变量是否能够进行偏移(shift)呢?什么是偏移?见下面的代码,将sh07.sh稍作修改,用来显示每次偏移后参数的变化情况。
#!/bin/bash
# Program:
# Program shows the secript name,parameters...
# History:
# 2018/11/25 steve First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "Total paramter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
shift # 进行第一次“一个变量的shift”
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
shift 3 # 进行第二次“三个变量的shift”
echo "Total paramter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
执行结果如下:
从上面的执行结果就可以看出,shift会移动变量,并且shift后面可以接数字,代表拿掉最前面的几个参数的意思。上面的执行结果中,第一次进行shift后面它的显示情况是“two three four five six",就剩五个参数了!第二次直接拿掉三个,就变成“two three four five six”。这样这个案例就解释shift的作用了。