前言
自从接触linux以来,看过一些脚本,但是还从没正儿八经的写过一个脚本。这次本人被分配一个任务,写一个数据文件维护工具,数据文件是公司软件内部产生的一些记录,这些文件分散在各个目录。已经写了一个对单个文件处理的小工具,现在需要一个脚本遍历指定目录、指定类型的文件,对这些文件调用前述工具来进行处理。写下此文来总结此次编写脚本所涉及的bash shell知识。
脚本参数
因为脚本需要执行时输入两个参数,一个参数指定目录,另一个可选参数指定是否需要递归遍历,执行时如下:
[root@localhost ~]# ./calltools.sh dir -r
Bash通过 位置变量参数来向脚本传递参数, 位置变量参数是只读的。可以向脚本传递任意多个参数,但是只有前9个参数才可以被脚本访问,使用shift命令可以改变这个限制。但是目前对于我来说,还没有用到超过9个参数的情况,所以先不研究shift如何使用。 脚本中通过$1~$9来访问第一个到第九个参数。$0预保留保存脚本的名字。
示例:
echo-argname.sh
#!/bin/bash
echo "script name: $0"
echo "first argname: $1"
echo "second argname: $2"
echo "third argname: $3"
echo "forth argname: $4"
在终端中输入:
[root@localhost ~]#./demo/echo-argname.sh aa bb cc dd
得到输出结果:
script name: ./demo/echo-argname.sh
first argname: aa
second argname: bb
third argname: cc
forth argname: dd
需要注意的是$0的作用其实非常大。例如,对于我此次任务来说,处理文件的工具和脚本在同一个目录,我在脚本中需要调用它,但是我并不知道这个脚本会部署在哪个目录,如何正确无误的调用这个工具呢? 这就需要$0来帮忙了。通过 dirname就可以获取得到脚本所在目录,代码如下:
script-path.sh
#!/bin/bash
script_path=$(dirname $0)
echo $script_path
在终端中输入:
[root@localhost ~]#./demo/script-path.sh
得到输出结果:
./demo
Bash除了$0之外,还有一些其他的保留变量参数:
特定变量
$# 传递到脚本的参数个数
$* 以一个单个字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项
$? 显示最后命令的退出状态,0表示没有错误,否则表明有错误
考虑所有的知识总结写在这一篇文章篇幅显得过大,还是分开记录好些,后面陆续总结一些shell知识。