前言

自从接触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知识。